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,此时已经可以完全验证小工具的使用情况了
很多东西,简单的想法会带来更大的收益!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值