zoukankan      html  css  js  c++  java
  • Java之dom4j的简单解析和生成xml的应用

      一、dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

      二、dom4j的xml解析过程

      1)加入依赖包

         <dependency>
          <groupId>org.dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <version>2.1.0</version>
        </dependency>
        <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>2.8.2</version>
        </dependency>

      说明:gson的目的是用来将数据转成json的形式

      2)xml模板

    <root>
        <test1>test1</test1>
        <test1>test11</test1>
        <test2>
            <test3>test3</test3>
            <test4>test4</test4>
        </test2>
        <test2>
            <test3>test5</test3>
            <test4>test6</test4>
        </test2>
    </root>

      3)解析

    import com.google.gson.Gson;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import java.io.File;import java.util.List;
    
    public class Dom4jUtil {
    
        public static void main(String[] args) throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("d:\1.xml"));
            Element root = document.getRootElement();
            JsonObject jsonObject = readXml(root);
            JsonObject jsonObjectRepetition = readXmlRepetition(root);
            Gson gson = new Gson();
            System.out.println(gson.toJson(jsonObject));
            System.out.println(gson.toJson(jsonObjectRepetition));
        }
    
        /**
         * 处理存在重复的标签数据(弊端,所有数据都是数组的方式存在,对xml的设计有要求,不然数据不好处理)
         * @param root
         * @return
         */
        public static JsonObject readXmlRepetition(Element root) {
            //获取节点下面的所有元素
            List<Element> elements = root.elements();
            //如果存在则处理数据或者直接返回节点数据
            if (elements != null && elements.size() > 0) {
                //声明一个json数据
                JsonObject jsonObject = new JsonObject();
                //声明一个json数组
                JsonArray mList = new JsonArray();
                //遍历所有元素
                for (Element element:elements) {
                    //读取节点数据直到节点下面没有其他元素
                    JsonObject jo = readXml(element);
                    mList.add(jo);
                }
                //加入json
                jsonObject.add(root.getName(), mList);
                return jsonObject;
            } else {
                JsonObject jsonObject = new JsonObject();
                jsonObject.addProperty(root.getName(), root.getText());
                return jsonObject;
            }
        }
    
    
        /**
         * 处理普通xml格式数据,不存在重复的标签(弊端,不能处理统一标签下的重复标签)
         * @param root
         * @return
         */
        public static JsonObject readXml(Element root) {
            //获取节点下面的所有元素
            List<Element> elements = root.elements();
            //如果存在则处理数据或者直接返回节点数据
            if (elements != null && elements.size() > 0) {
                //声明一个json数据
                JsonObject map = new JsonObject();
                //这个是处理所有下面的数据保存在一个json中
                JsonObject jo = new JsonObject();
                for (Element element:elements) {
                    JsonObject m = readXml(element);
                    jo.add(element.getName(), m.get(element.getName()));
                }
                map.add(root.getName(), jo);
                return map;
            } else {
                JsonObject map = new JsonObject();
                map.addProperty(root.getName(), root.getText());
                return map;
            }
        }
    
    }

      4)测试结果展示

    {"root":{"test1":"test11","test2":{"test3":"test5","test4":"test6"}}}
    {"root":[{"test1":"test1"},{"test1":"test11"},{"test2":{"test3":"test3","test4":"test4"}},{"test2":{"test3":"test5","test4":"test6"}}]}

      三、重点说明一下

      1)上面写出来的工具,基本上都是用来处理特定数据的工具

      2)方法的实现上面还可以完善,但是我一直没有找到好的数据表现形式所以写了两个方法

      3)可以参考这种做法,进一步做深度解析

      四、xml的创建

    public static void main(String[] args) throws Exception {
            Document document = DocumentHelper.createDocument();
            Element root = document.addElement("root");
            Element test1 = root.addElement("test1");
            test1.addText("test1");
            Element test2 = root.addElement("test2");
            test2.addText("test2");
            OutputStream outputStream = new FileOutputStream("d:\2.xml");
            XMLWriter xmlWriter = new XMLWriter(outputStream);
            xmlWriter.write(document);
            xmlWriter.close();
        }

      备注:这里xml创建不细讲,很多时候都是根据业务来的。

      

  • 相关阅读:
    怎样才是全能的程序员?
    [HDU 2553]N皇后问题
    [HDU 1870]愚人节的礼物
    [HDU 1016]Prime Ring Problem
    [HDU 1241]Oil Deposits
    [POJ 3250]Bad Hair Day
    [HDU 1276]士兵队列训练问题
    [POJ 2796]Feel Good
    [HDU 1237] 简单计算器
    总算开通博客园啦~
  • 原文地址:https://www.cnblogs.com/ll409546297/p/8302062.html
Copyright © 2011-2022 走看看