将xml字符串的所有叶标签转换成Map集合

实际问题:对方服务器接口采用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,举例:
     * 入参:
     *    
     *        
     *            aa
     *            aaa
     *        
     *        
     *            bb
     *            bbb
     *        
     *        c
     *    
     * 返回:
     *     {aa=aa, aaa=aaa, bb=bb, bbb=bbb, c=c}
     *
     * @param xmlStr xml文件字符串
     * @return
     */
    public static Map xml2Map(String xmlStr) {
        Map map = new HashMap();
        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 map, Element node) {
        List 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 = "aaaaabbbbbc";
        Map map = xml2Map(xmlStr);
        System.out.println(map);// {aa=aa, aaa=aaa, bb=bb, bbb=bbb, c=c} 
    }
}

你可能感兴趣的:(将xml字符串的所有叶标签转换成Map集合)