Java使用dom4j解析XML

 更新时间:2024年12月12日 08:56:32   作者:山风wind  
dom4j是一个开源的、基于Java的XML解析库,而在Java中使用dom4j库解析XML是一种常见的方法,下面就跟随小编一起来学习一下Java如何使用dom4j解析XML吧

Java解析XML dom4j 简单易上手

在Java中使用dom4j库解析XML是一种常见的方法。dom4j是一个开源的、基于Java的XML解析库,它结合了DOM(文档对象模型)、SAX(简单API for XML)和事件驱动的优点,使得处理XML更加容易。

Maven项目添加依赖

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

XML示例文件

文件保存在项目resource目录下:

<root>
    <name length="4" isFrom="true">张三</name>
    <age length="2" isFrom="false">99</age>
    <address length="5" region="中国">陕西</address>
    <hobbies>
        <hobby price="100">足球</hobby>
        <hobby price="10">篮球</hobby>
        <hobby price="100">排球</hobby>
    </hobbies>
</root>

dom4j 操作xml文件

文件从resouce目录下获取到:

/**
 * 读取XML文件并打印其结构和内容。
 * @throws DocumentException 如果解析XML文件时发生错误
 */
private static void parseXmlGetInfo() throws DocumentException {
    // 创建一个SAXReader对象用于读取XML文档
    SAXReader reader = new SAXReader();
    // 读取XML文件 加载XML文档 你可以从文件、字符串或输入流加载XML文档。
    Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"));

    // 获取根元素 一旦你有了Document对象,就可以通过它来访问XML文档的内容
    Element root = document.getRootElement();

    // 打印根元素的名称
    System.out.println("根元素名称:" + root.getName());

    // 遍历根元素的所有子元素
    for (Element child : root.elements()) {
        if (child.elements().isEmpty()) {
            // 如果子元素没有子元素,则打印子元素的信息
            System.out.println("-------------------------------------------");
            System.out.println("---子元素名称:" + child.getName());
            System.out.println("---子元素文本:" + child.getText());
            // 打印子元素的属性值
            System.out.println("---子元素属性 length:" + child.attributeValue("length"));
            System.out.println("---子元素属性 isForm:" + child.attributeValue("isForm"));
            System.out.println("---子元素属性 region:" + child.attributeValue("region"));
            System.out.println("-------------------------------------------");
        } else {
            // 如果子元素有子元素,则遍历并打印孙元素的信息
            for (Element grandChild : child.elements()) {
                System.out.println("-------------------------------------------");
                System.out.println("------孙元素名称:" + grandChild.getName());
                System.out.println("------孙元素文本:" + grandChild.getText());
                System.out.println("-------------------------------------------");
            }
        }
    }
}

结果:

处理XML文档中的文本转换

处理XML文档中的文本转换通常涉及到将文本从一种格式或编码转换为另一种。在使用dom4j进行Java编程时,可以采取以下几种方法来处理这些转换:

1. 文本编码转换

需要改变XML文件的编码方式(例如从UTF-8转换为ISO-8859-1),可以在读取和写入XML文档时指定编码。

读取时指定编码

InputStream inputStream = new FileInputStream("xmlfile.xml");
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8"); // 指定编码
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(reader);

写入时指定编码

OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 设置输出编码
XMLWriter writer = new XMLWriter(new FileOutputStream("path/to/output.xml"), format);
writer.write(document);
writer.close();

2. 特殊字符转义

在XML中,某些字符如 <, >, &, " 和 ’ 需要被转义以避免语法错误。dom4j会自动处理这些特殊字符的转义。

3. 处理CDATA

如果文本包含不应该被解析器解释的字符序列,可以放入CDATA段落中。dom4j也支持创建和处理CDATA部分。

Element cdataElement = root.addElement("cdataElement");
CDATA cdata = new CDATA("<b>This is bold text</b>");
cdataElement.add(cdata);

解析String类型的XML

获取到Document对象之后,其他操作相同。

 /**
 * 读取XML文件并将其内容解析为字符串,然后打印出来。
 * @throws Exception 如果读取或解析过程中发生错误
 */
public static void parseXmlString() throws Exception {
    // 获取资源文件的输入流
    InputStream inputStream = parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml");
    if (inputStream == null) {
        // 如果资源文件未找到,抛出IOException
        throw new IOException("Resource not found");
    }
    StringBuilder stringBuilder = new StringBuilder();
    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
        String line;
        // 逐行读取输入流的内容并追加到StringBuilder中
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line).append("\n");
        }
    } catch (IOException e) {
        // 捕获并重新抛出IOException
        throw new RuntimeException(e);
    }
    // 打印XML内容
    System.out.println(stringBuilder);

    // 将字符串解析为Document对象
    Document document = DocumentHelper.parseText(stringBuilder.toString());
}

使用Xpath通过制定位置定位到XML中的节点元素

maven引入依赖jaxen

<dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.2.0</version>
    </dependency>

XPath的语法

绝对路径表示方式:

以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如 /元素/子元素/子子元素……;

相对路径的表达方式:

相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素,./表示当前元素;

全文搜索路径方式:

例如//子元素,//子元素//子子元素,//子元素/子子元素。

注意:

表示无论中间有多少层,直接获取所有子元素所有满足条件的元素

表示只找一层

谓语(条件筛选形式)

例如 : //元素[@attr1=value]

/**
 * 使用XPath表达式从XML文件中选择节点并打印相关信息。
 * @throws DocumentException 如果解析XML文件时发生错误
 */
private static void useXpath() throws DocumentException {
    // 创建一个SAXReader对象用于读取XML文档
    SAXReader reader = new SAXReader();
    // 读取XML文件
    Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"));

    // 使用XPath表达式获取指定节点
    Element element = (Element) document.selectSingleNode("root/name");
    // 打印节点的文本内容
    System.out.println(element.getText());

    // 指定路径获取所有hobby节点
    List<Node> nodes = document.selectNodes("root/hobbies/hobby");
    for (Node node : nodes) {
        // 打印每个hobby节点的文本内容
        System.out.println(node.getText());
    }
    System.out.println("------------------");

    // 使用通配符获取所有hobby节点
    List<Node> nodeList = document.selectNodes("//hobby");
    for (Node node : nodeList) {
        // 打印每个hobby节点的文本内容
        System.out.println(node.getText());
    }
    System.out.println("------------------");

    // 使用XPath表达式获取具有特定属性的节点
    Element idElement = (Element) document.selectSingleNode("//hobby[@price='10']");
    // 打印节点的文本内容
    System.out.println(idElement.getText());
}

结果:

总结

使用dom4j结合XPath解析XML提供了一种强大而灵活的方式来查询和操作XML数据。XPath表达式的简洁性和灵活性使得即使对于结构复杂的XML文档,也能够快速准确地定位所需的数据。同时,dom4j提供了简单易用的API,方便开发者进行各种XML相关的操作。

到此这篇关于Java使用dom4j解析XML的文章就介绍到这了,更多相关Java dom4j解析XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot参数校验之@Validated的使用详解

    SpringBoot参数校验之@Validated的使用详解

    这篇文章主要通过示例为大家详细介绍一下介绍了SpringBoot参数校验中@Validated的使用方法,文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • 在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤

    基于Java配置选项,可以编写大多数的Spring不用配置XML,下面这篇文章主要给大家介绍了关于在Spring中基于Java类进行配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • java类Circle定义计算圆的面积和周长代码示例

    java类Circle定义计算圆的面积和周长代码示例

    要用Java计算圆的周长和面积,需要使用圆的半径和一些数学公式,下面这篇文章主要给大家介绍了关于java类Circle定义计算圆的面积、周长的相关资料,需要的朋友可以参考下
    2024-04-04
  • 浅谈idea中导入maven项目的两种方式

    浅谈idea中导入maven项目的两种方式

    本文主要介绍了浅谈idea中导入maven项目的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Java8中Stream API的peek()方法详解及需要注意的坑

    Java8中Stream API的peek()方法详解及需要注意的坑

    这篇文章主要给大家介绍了关于Java8中Stream API的peek()方法详解及需要注意的坑,Java 中的 peek 方法是 Java 8 中的 Stream API 中的一个方法,它属于中间操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Java8 使用流抽取List<T>集合中T的某个属性操作

    Java8 使用流抽取List<T>集合中T的某个属性操作

    这篇文章主要介绍了Java8 使用流抽取List<T>集合中T的某个属性操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 解决tk.mybatis中写自定义的mapper的问题

    解决tk.mybatis中写自定义的mapper的问题

    这篇文章主要介绍了使用tk.mybatis中写自定义的mapper的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 使用 Redis 缓存实现点赞和取消点赞的示例代码

    使用 Redis 缓存实现点赞和取消点赞的示例代码

    这篇文章主要介绍了使用 Redis 缓存实现点赞和取消点赞的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java利用delayedQueue实现本地的延迟队列

    java利用delayedQueue实现本地的延迟队列

    这篇文章主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Springboot中用 Netty 开启UDP服务方式

    Springboot中用 Netty 开启UDP服务方式

    这篇文章主要介绍了Springboot中用 Netty 开启UDP服务方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论