public class xmlToMapUtils { /** * xml字符串轉爲map集合 * @param xmlStr * @return */ public static Map<String, Object> xmlToMap(String xmlStr){ List<Map<String, String>> resultList = iterateWholeXML(xmlStr); Map<String, Object> retMap = new HashMap<String, Object>(); for (int i = 0; i < resultList.size(); i++) { Map<String,Object> map = (Map)resultList.get(i); for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); retMap.put(key, map.get(key)); } } return retMap; } /** * 遞歸解析任意的xml 遍歷每一個節點和屬性 * * @param xmlStr */ private static List<Map<String, String>> iterateWholeXML(String xmlStr) { List<Map<String, String>> list = new ArrayList(); try { Document document = DocumentHelper.parseText(xmlStr); Element root = document.getRootElement(); recursiveNode(root, list); return list; } catch (DocumentException e) { e.printStackTrace(); } return null; } /** * 遞歸遍歷全部的節點得到對應的值 * * @param */ private static void recursiveNode(Element root, List<Map<String, String>> list) { // 遍歷根結點的全部孩子節點 HashMap<String, String> map = new HashMap(); for (Iterator iter = root.elementIterator(); iter.hasNext();) { Element element = (Element) iter.next(); if (element == null) continue; // 獲取屬性和它的值 for (Iterator attrs = element.attributeIterator(); attrs.hasNext();) { Attribute attr = (Attribute) attrs.next(); if (attr == null) continue; String attrName = attr.getName(); String attrValue = attr.getValue(); map.put(attrName, attrValue); } // 若是有PCDATA,則直接提出 if (element.isTextOnly()) { String innerName = element.getName(); String innerValue = element.getText(); map.put(innerName, innerValue); list.add(map); } else { // 遞歸調用 recursiveNode(element, list); } } } /** * 測試 */ public static void main(String[] args) { String xmlStr = "<?xml version='1.0' encoding='UTF-8'?><OPERATION><HEAD><TIMESTAMP>20190621173338</TIMESTAMP><LOCATION>SHANGHAI</LOCATION></HEAD><BODY><OPERATORID>admin</OPERATORID><OPERATORIP>127.0.0.1</OPERATORIP><USERINFO><USERID>1</USERID><USERNAME>zhangsan</USERNAME><PASSWORD>123456</PASSWORD><MOBILE>11111111111</MOBILE></USERINFO></BODY></OPERATION>"; Map<String, Object> xmlToMap = xmlToMap(xmlStr); Set<Map.Entry<String,Object>> entrySet = xmlToMap.entrySet(); for (Map.Entry<String, Object> entry : entrySet) { System.out.println(entry.getKey()+"---"+entry.getValue()); } } }
結果以下: java