xml转map自制小工具

网上xml转map的例子很多,大多原理都差不多,但是好用的并不多,这里自己写了小工具,效果谁用谁知道
xml转map自制小工具_第1张图片

代码示例

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 = "\n" +
                "            张三\n" +
                "            18\n" +
                "            \n" +
                "                    篮球\n" +
                "                    足球\n" +
                "            \n" +
                "        ";

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

    }

}

测试xml报文

<note>
      <name>张三name>
      <age>18age>
      <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 = "\n" +
                "            张三\n" +
                "            18\n" +
                "            \n" +
                "                    篮球\n" +
                "                    足球\n" +
                "            \n" +
                "        ";

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

    }

}

代码里面增加父级目录的概念,继续使用该报文测试:

{name=张三, hobby.aa=篮球, hobby.bb=足球, age=18}

此时,map里面的key全部增加了目录,可以很清楚的看到xml的层级结构,为了验证迭代效果,我们再增加一级目录测试一下

测试报文升级:

<note>
      <name>张三name>
      <age>18age>
      <hobby>
             <aa>篮球aa>
             <attr>
                    <color>黄色color>
             attr>
             <bb>足球bb>
      hobby>
note>    

测试结果如下:

{name=张三, hobby.aa=篮球, hobby.bb=足球, hobby.attr.color=黄色, age=18}

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

你可能感兴趣的:(java)