實際問題:對方服務器接口採用webservice方式返回xml報文,現需解析xml獲取全部葉節點的標籤名及攜帶的值java
解決方案:利用dom4j解析xml並利用遞歸獲取葉節點,將標籤名及標籤值封裝到Map集合供業務調用node
import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class XmlUtil { /** * 接收xml文件字符串,返回一個Map,其包含xml中全部葉節點的K-V,舉例: * 入參: * <ROOT> * <a> * <aa>aa</aa> * <aaa>aaa</aaa> * </a> * <b> * <bb>bb</bb> * <bbb>bbb</bbb> * </b> * <c>c</c> * </ROOT> * 返回: * {aa=aa, aaa=aaa, bb=bb, bbb=bbb, c=c} * * @param xmlStr xml文件字符串 * @return */ public static Map<String, Object> xml2Map(String xmlStr) { Map<String, Object> map = new HashMap<String, Object>(); try { // 將xml格式的字符串轉換成Document對象 Document doc = DocumentHelper.parseText(xmlStr); // 獲取根節點 Element root = doc.getRootElement(); // 將xml的全部葉節點的name-value封裝進Map leafNode2Map(map, root); } catch (Exception e) { e.printStackTrace(); } return map; } /** * 將xml的全部葉節點的name-value封裝進Map * * @param map * @param node */ @SuppressWarnings("unchecked") private static void leafNode2Map(Map<String, Object> map, Element node) { List<Element> elements = node.elements(); if (elements == null || elements.size() == 0) { map.put(node.getName(), node.getTextTrim()); } else { for (Element element : elements) { // 遞歸 leafNode2Map(map, element); } } } public static void main(String[] args) { String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><a><aa>aa</aa><aaa>aaa</aaa></a><b><bb>bb</bb><bbb>bbb</bbb></b><c>c</c></ROOT>"; Map<String, Object> map = xml2Map(xmlStr); System.out.println(map);// {aa=aa, aaa=aaa, bb=bb, bbb=bbb, c=c} } }