超复杂毫无规律的多重list的XML转Map (且同一个list节点里面有多个相同name)

忙里偷闲,上班时间写博客哈哈。

 年初遇到一个变态需求 很复杂的xml 转map 再清洗数据按要求入库。尝试了几种解析的方法....今天把它记下来

如下的报文结构大概是在第四层list 中的部分

超复杂毫无规律的多重list的XML转Map (且同一个list节点里面有多个相同name)

 

解析代码如下:

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 2019/01/04
 * @author zhoujia
 *
 */
public class XMLToMapUtil {

    public Map<String, Object> parseXml(File filePath) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(filePath);//读取xml文档
        Element root = document.getRootElement();//得到xml文档根节点元素,即最上层的"<xml>"
        Map<String, Object> map = new HashMap<String, Object>();
        this.elementTomap(root, map);
        return map;

    }

    /*** * XmlToMap核心方法,里面有递归调用
     * * @param map
     * * @param ele
     * */
    @SuppressWarnings("unchecked")
    public Map<String, Object> elementTomap(Element outele, Map<String, Object> outmap) {
        List<Element> list = outele.elements();
        int size = list.size();
        if (size == 0) {
            outmap.put(outele.getName(), outele.getTextTrim());
        } else {
            Map<String, Object> innermap = new HashMap<String, Object>();
            int i = 1;
            /*int svc = 0;*/
            for (Element ele1 : list) {
                String eleName = ele1.getName();
                /*if (eleName.equals("Svc")) {
                    svc = svc + 1;
                }*/
                String value = ele1.getText();
                Object obj = innermap.get(eleName);
                if (obj == null) {
                    elementTomap(ele1, innermap);
                } else {
                    if (obj instanceof java.util.Map) {
                        List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
                        list1.add((Map<String, Object>) innermap.remove(eleName));
                        elementTomap(ele1, innermap);
                        list1.add((Map<String, Object>) innermap.remove(eleName));
                        innermap.put(eleName, list1);
                    } else if (obj instanceof String) {
                        // for list same <dom>
                        innermap.put(eleName + i, value);
                        i++;
                    } else {
                        elementTomap(ele1, innermap);
                        Map<String, Object> listValue = (Map<String, Object>) innermap.get(eleName);
                        ((List<Map<String, Object>>) obj).add(listValue);
                        innermap.put(eleName, obj);
                    }

                }
            }
            outmap.put(outele.getName(), innermap);
        }
        return outmap;
    }

    /**
    * @param args
    * 功能测试
    */
    public Map<String, Object> xmlToMap(String path) {
        File file = new File(path);
        try {
            Map<String, Object> map = this.parseXml(file);
            return map;
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

最终解析出来 map 里面有list list 里面又有map 此结构多重。