Java之dom4j的简单解析和生成xml的应用

简介:   一、dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

  一、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创建不细讲,很多时候都是根据业务来的。

  

 

相关文章
|
1天前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
12 3
|
2天前
|
Java API 开发者
Java中Lambda表达式的深入理解与应用
【5月更文挑战第12天】在Java 8之后,Lambda表达式已经成为了Java开发者必备的技能之一。Lambda表达式以其简洁、灵活的特点,大大提高了编程的效率。本文将深入探讨Lambda表达式的基本概念,语法规则,以及在实际开发中的应用,帮助读者更好地理解和使用Lambda表达式。
|
4天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
|
4天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
21 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
5天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
19 0
|
5天前
|
传感器 机器人 Java
使用Java构建机器人应用
使用Java构建机器人应用
10 0
|
5天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
9 0
|
5天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
16 0
|
2天前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
16 5
|
2天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。

推荐镜像

更多