实际问题:对方服务器接口采用webservice方式返回xml报文,现需解析xml获取所有叶节点的标签名及携带的值
解决方案:利用dom4j解析xml并利用递归获取叶节点,将标签名及标签值封装到Map集合供业务调用
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} } }