递归方式将多层级xml转成map

来源:互联网 发布:淘宝怎么邮箱注册 编辑:程序博客网 时间:2024/05/21 06:40

在工作当中,往往接收到第三方报文时,会遇到xml报文转map数据结构的需求,如果是xml报文只有一个层级的话,递归转换很方便,但是多层级的xml转map,怎么转呢?我再网上看到了许许多多的实例,觉得很多不能满足我逾期的效果,所以整理了一下自己的想法,记录一下。

一、场景:

多层级的xml报文如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
    <name>张三</name>
    <age>1</age>
    <addrs>
        <addr>
            <prov>江苏</prov>
            <contry>南京</contry>
        </addr>
        <addr>
            <prov>江苏</prov>
            <contry>淮安</contry>
        </addr>
    </addrs>
</xml>

想得到的结果:

{
    addrs=[
        {contry=南京, prov=江苏},
        {contry=淮安, prov=江苏}
          ],
    name=张三,
    age=1
}


二、案例代码:

public class TEST {
    public static void main(String[] args) {

            String xmlstr = "";//xml报文

            Map<String, Object> mapXml = xmltoMap(xmlstr);
            System.out.println("------"+mapXml.toString());

    }

   /**
     * xml转成map
     * @param xmlstr xml报文
     * @return
     */
    public static Map<String, Object> xmltoMap(String xmlstr){
         Document doc = null;  
         try {  
             doc = DocumentHelper.parseText(xmlstr);  
         } catch (DocumentException e) {  
            //logger.error("parse text error : " + e);  
         }  
             Element rootElement = doc.getRootElement();
             Map<String,Object> mapXml = new HashMap<String,Object>();  
             elementToMap(mapXml,rootElement);
         return mapXml;  
    }


    /**
     * 遍历子节点
     * @param map
     * @param rootElement
     */
    public static void elementToMap(Map<String, Object> map, Element rootElement){
        //获得当前节点的子节点  
        List<Element> elements = rootElement.elements();
        Map<String,Object> childMap = new HashMap<String,Object>();
        //如果还存在子节点,就考虑list情况,继续递归
        for (Element element : elements) {
            List<Element> es = element.elements();
            if(es.size()>0){
                //获取当前节点下的子节点
                ArrayList<Map> list = new ArrayList<Map>();
                for(Element e:es){
                    elementChildToList(list,e);
                }
                map.put(element.getName(), list);
            }else{
                map.put(element.getName(),element.getText());
            }
            
        }
    }


   /**
     * 递归子节点
     * @param arrayList
     * @param rootElement
     */
    public static void elementChildToList(ArrayList<Map> arrayList, Element rootElement){
        //获得当前节点的子节点  
        List<Element> elements = rootElement.elements();
        if(elements.size()>0){
            ArrayList<Map> list = new ArrayList<Map>();
            Map<String,Object> sameTempMap = new HashMap<String,Object>();
            for(Element element:elements){
                elementChildToList(list,element);
                sameTempMap.put(element.getName(), element.getText());
            }
            System.out.println(elements.size());
            arrayList.add(sameTempMap);
        }
        
    }


}



我感觉我这种写法虽然能解决了问题,但是却有些笨拙,不知道各位有没有更好的,希望各位不吝赐教。

原创粉丝点击