xml轉map自制小工具

網上xml轉map的例子很多,大多原理都差不多,但是好用的並不多,這裏自己寫了小工具,效果誰用誰知道
在這裏插入圖片描述

代碼示例

import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.List;
import java.util.Map;

/**
 * @author yanghao
 * @version XmlUtil.java, v 0.1 2019-04-08 11:52
 */
public class XmlUtil {

    /**
     * xml --> map
     */
    public static Map<String, Object> xmlToMap(String xmlStr){
        Map<String, Object> map = Maps.newHashMap();

        try {
            Document doc = DocumentHelper.parseText(xmlStr);
            //根結點
            Element root = doc.getRootElement();

            //處理xml
            dealElement(root, map);

        }catch (Exception e){
            e.printStackTrace();
        }

        return map;
    }

    /**
     * 迭代處理xml  --- 放入同級map
     * @param element
     * @param map
     */
    private static void dealElement(Element element, Map<String, Object> map) {
        if(element.isTextOnly()){
            //單節點
            map.put(element.getName(), element.getText());

        }else {
            //多節點
            List<Element> list = element.elements();
            for(Element e : list){
                //迭代下一次循環
                dealElement(e, map);
            }

        }
    }

    /**
     * 測試類
     * @param args
     */
    public static void main(String[] args){

        String xmlStr = "<note>\n" +
                "            <name>張三</name>\n" +
                "            <age>18</age>\n" +
                "            <hobby>\n" +
                "                    <aa>籃球</aa>\n" +
                "                    <bb>足球</bb>\n" +
                "            </hobby>\n" +
                "        </note>";

        System.out.println(XmlUtil.xmlToMap(xmlStr));

    }

}

測試xml報文

<note>
      <name>張三</name>
      <age>18</age>
      <hobby>
             <aa>籃球</aa>
             <bb>足球</bb>
      </hobby>
</note>   

運行結果如下:

{aa=籃球, bb=足球, name=張三, age=18}

可以看出,xml已經轉化成我們需要的map了,並且是同級map裏面
這裏有一個缺點,如果不同層級的xml節點的key是一樣,就會把map裏面覆蓋掉;並且不能看出這個key的真正節點位置

我們繼續優化

import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.List;
import java.util.Map;

/**
 * @author yanghao
 * @version XmlUtil.java, v 0.1 2019-04-08 11:52
 */
public class XmlUtil {

    /**
     * xml --> map
     */
    public static Map<String, Object> xmlToMap(String xmlStr){
        Map<String, Object> map = Maps.newHashMap();

        try {
            Document doc = DocumentHelper.parseText(xmlStr);
            //根結點
            Element root = doc.getRootElement();

            //處理xml
            dealElement(root.getName(), root, map);

        }catch (Exception e){
            e.printStackTrace();
        }

        return map;
    }

    /**
     * 迭代處理xml  --- 放入同級map
     * @param name   父級目錄
     * @param element
     * @param map
     */
    private static void dealElement(String name, Element element, Map<String, Object> map) {
        if(element.isTextOnly()){
            //單節點
            map.put("note".equals(name)? element.getName() : name + "." + element.getName(), element.getText());

        }else {
            //多節點
            List<Element> list = element.elements();
            for(Element e : list){
                //迭代下一次循環
                dealElement("note".equals(name)? element.getName() : name + "." + element.getName(), e, map);
            }

        }
    }

    /**
     * 測試類
     * @param args
     */
    public static void main(String[] args){

        String xmlStr = "<note>\n" +
                "            <name>張三</name>\n" +
                "            <age>18</age>\n" +
                "            <hobby>\n" +
                "                    <aa>籃球</aa>\n" +
                "                    <bb>足球</bb>\n" +
                "            </hobby>\n" +
                "        </note>";

        System.out.println(XmlUtil.xmlToMap(xmlStr));

    }

}

代碼裏面增加父級目錄的概念,繼續使用該報文測試:

{name=張三, hobby.aa=籃球, hobby.bb=足球, age=18}

此時,map裏面的key全部增加了目錄,可以很清楚的看到xml的層級結構,爲了驗證迭代效果,我們再增加一級目錄測試一下

測試報文升級:

<note>
      <name>張三</name>
      <age>18</age>
      <hobby>
             <aa>籃球</aa>
             <attr>
                    <color>黃色</color>
             </attr>
             <bb>足球</bb>
      </hobby>
</note>    

測試結果如下:

{name=張三, hobby.aa=籃球, hobby.bb=足球, hobby.attr.color=黃色, age=18}

ok,此時已經可以完全驗證小工具的使用情況了
很多東西,簡單的想法會帶來更大的收益!

發佈了40 篇原創文章 · 獲贊 60 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章