利用 JDK
自帶的 org.w3c.dom
進行對象,map
與 xml
的簡單互相轉換, 其中用到了一個工具類 Hutools
下面是hutools
的maven
依賴java
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.1.19</version> </dependency>
下面是工具類node
/** * xml 工具,基於 jdk 內置的 xml api * @author zcqshine * @date 2018/12/8 */ @Slf4j public class W3CXmlUtil { /** * Number 子類的類型名稱集合 */ private static final Set<String> NUMBER_CHILDREN_CLASS_NAME = new HashSet<>(); static { NUMBER_CHILDREN_CLASS_NAME.add(Integer.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(Float.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(Short.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(Double.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(Long.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(BigDecimal.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(BigInteger.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(int.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(short.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(float.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(double.class.getName()); NUMBER_CHILDREN_CLASS_NAME.add(long.class.getName()); } /** * xml 字符串轉換爲 Object * @param xmlStr * @param clazz * @param <T> * @return * @throws Exception */ public static <T> T readObjectFormXml(String xmlStr, Class<T> clazz) throws Exception { T t; if (xmlStr == null || xmlStr.trim().length() == 0){ throw new IllegalArgumentException("XML content string is empty !"); } else { try { t = clazz.newInstance(); Document document = XmlUtil.parseXml(xmlStr); if (document != null){ Element element = document.getDocumentElement(); if (element != null){ NodeList nodeList = element.getChildNodes(); for (int i = 0; i<nodeList.getLength(); i++){ Node node = nodeList.item(i); if (node instanceof Element){ String nodeName = node.getNodeName(); String nodeText = node.getTextContent(); try { Field field = t.getClass().getDeclaredField(nodeName); Method method = t.getClass().getMethod("set" + StrUtil.upperFirst(nodeName),field.getType()); String fieldType = field.getGenericType().getTypeName(); if (fieldType.equals(String.class.getName()) || fieldType.equals(char.class.getName())){ method.invoke(t, nodeText); } else if (NUMBER_CHILDREN_CLASS_NAME.contains(fieldType) && NumberUtils.isCreatable(nodeText)){ Number number = NumberUtils.createNumber(nodeText); method.invoke(t, number); } else if (fieldType.equals(Date.class.getName())){ try { Date date = DateUtil.parse(nodeText); method.invoke(t, date); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { log.info("字段:{} 不爲時間格式的字符串,放棄解析.", nodeText); } } } catch (NoSuchFieldException | SecurityException e) { log.info("{}屬性不存在,繼續處理其餘屬性", nodeName); } } } } } } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { log.error("轉換 xml 字符串爲對象失敗. ",e); throw new Exception("parse xml to Bean failure."); } } return t; } /** * XML 字符串轉 TreeMap * @param xmlStr * @return */ public static Map<String, String> xml2Map(String xmlStr){ Map<String,String> map = new TreeMap<>(); if (StrUtil.isBlank(xmlStr)){ throw new IllegalArgumentException("xml is empty"); }else{ Document document = XmlUtil.parseXml(xmlStr); Element element = document.getDocumentElement(); if (element != null){ NodeList nodeList = element.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++){ Node node = nodeList.item(i); String nodeName = node.getNodeName(); String nodeText = node.getTextContent(); map.put(nodeName, nodeText); } } } return map; } /** * Object 轉 xml 字符串 * @param t * @param <T> * @return */ public static <T> String object2Xml(T t){ try { //獲得 DOM 解析器的工廠實例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //從 DOM 工廠中得到 DOM 解析器 DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.newDocument(); Element root = document.createElement("xml"); document.appendChild(root); Class clazz = t.getClass(); Field[] fields = clazz.getDeclaredFields(); if (fields.length > 0){ for (Field field : fields) { field.setAccessible(true); String fieldName = field.getName(); Element element = document.createElement(fieldName); Object obj = field.get(t); if (obj != null){ String value = String.valueOf(obj); element.appendChild(document.createCDATASection(value)); } root.appendChild(element); } } return XmlUtil.toStr(document); } catch (ParserConfigurationException | IllegalAccessException e) { log.error("對象轉 XML 失敗. ", e); } return null; } /** * map 轉 xml * @param map * @return */ public static <T> String map2Xml(Map<String, T> map){ if (map != null && !map.isEmpty()){ try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //從 DOM 工廠中得到 DOM 解析器 DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.newDocument(); Element root = document.createElement("xml"); document.appendChild(root); map.entrySet().forEach(item -> { String key = item.getKey(); T object = item.getValue(); String value = null; if (object != null){ value = String.valueOf(object); } Element element = document.createElement(key); element.appendChild(document.createCDATASection(value)); root.appendChild(element); }); return XmlUtil.toStr(document); } catch (ParserConfigurationException e) { log.error("map轉 xml 失敗.", e); } } return null; } }