使用Dom4J解析XML文档

简介: XML解析的方式XML常见的两种解析方式:DOM: 要求解析器将整个XML文件全部加载到内存中,生成一个Document对象优点:元素和元素之间保留结构、关系,可以针对元素进行增删查改操作缺点:如果XML文件过大,可能会导致内存溢出SAX:是一种速度更快,更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件优点: 不会出现内存溢出的问题,可以处理大文件缺点:只能读,不能写概念辨析:解析器就是根据不同的解析方式提供具体的实现。为了方便开发人员来解析XML,有一些方便操作的类库。例如Dom4j其中就包含了很多解

XML解析的方式
XML常见的两种解析方式:

DOM: 要求解析器将整个XML文件全部加载到内存中,生成一个Document对象

优点:元素和元素之间保留结构、关系,可以针对元素进行增删查改操作
缺点:如果XML文件过大,可能会导致内存溢出
SAX:是一种速度更快,更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件

优点: 不会出现内存溢出的问题,可以处理大文件
缺点:只能读,不能写
概念辨析:

解析器就是根据不同的解析方式提供具体的实现。
为了方便开发人员来解析XML,有一些方便操作的类库。例如Dom4j其中就包含了很多解析器。
使用Dom4J解析XML文档
依赖:

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

1
2
3
4
5
使用方法:

创建解析器对象
使用解析器对象读取XML文档生成Document对象
根据Document对象获取XML的元素(标签)
常用的方法:

我们来看一段代码:

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>



张三

panpan@qq.cn


李四

wusong@qq.cn


王五

wuda@qq.cn



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
测试代码:

public class Dom4jParseTest {

public static void main(String[] args) throws FileNotFoundException, DocumentException {
    InputStream xmlFile = Dom4jParseTest.class.getClassLoader().getResourceAsStream("Contacts.xml");
    //创建解析器对象
    SAXReader saxReader = new SAXReader();
    Document document = saxReader.read(xmlFile);
    // 获取根元素对象
    Element root = document.getRootElement();
    //获取根元素名字
    System.out.println("root.getName() ---> " + root.getName());

    // 4、拿根元素下的全部子元素对象(一级)
    // List<Element> sonEles =  root.elements();
    List<Element> sonEles =  root.elements("contact");
    for (Element sonEle : sonEles) {
        System.out.println("sonEle.getName() ---> " + sonEle.getName());
    }

    // 拿某个子元素
    Element userEle = root.element("user");
    System.out.println("userEle.getName() ---> " + userEle.getName());

    // 默认提取第一个子元素对象 (Java语言。)
    Element contact = root.element("contact");
    // 获取子元素文本
    System.out.println("contact.elementText('name') ---> " + contact.elementText("name"));
    // 去掉前后空格
    System.out.println("contact.elementTextTrim('name') ---> " + contact.elementTextTrim("name"));
    // 获取当前元素下的子元素对象
    Element email = contact.element("email");
    System.out.println("email.getText() ---> " + email.getText());
    // 去掉前后空格
    System.out.println("email.getTextTrim() ---> " + email.getTextTrim());

    // 根据元素获取属性值
    Attribute idAttr = contact.attribute("id");
    System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
    // 直接提取属性值
    System.out.println("contact.attributeValue('id') ---> " + contact.attributeValue("id"));
    System.out.println("contact.attributeValue('vip') ---> " + contact.attributeValue("vip"));

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
结果:

Dom4J结合XPath解析XML
XPath使用路径表达式来定位XML文档中的元素节点或属性节点

依赖:

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

1
2
3
4
5
常见的方法:

解释一下这里的Node:

在dom4j中,Node是通用的节点抽象,他有几个具体的实现类:

Element - 代表具体的XML元素
Attribute - 表示元素的属性
Text - 表示文本信息
CDATA - 表示CDATA块
Entity - 表示实体
Comment - 表示注释
Document - 表示整个文档
我们举几个例子:

Element - 代表一个XML元素


Tom

1
2
3
上例中,和都可以表示为Element。

Attribute - 元素的属性


Tom

1
2
3
上例中,gender="male"可以表示为一个Attribute节点。

Text - 元素中的文本内容

Tom
1

元素中的Tom可以表示为一个Text节点。

CDATA - CDATA块内容

<![CDATA[Tom is a good student.]]>
1
上例中的<![CDATA[Tom is a good student.]]>可以表示为一个CDATA节点。

Comment - 注释内容

1
上述注释可以表示为一个Comment节点。

Document - 代表整个XML文档

表达式:

绝对路径:/根元素/子元素/孙元素。采用绝对路径获取从根节点开始逐层的查找节点列表并返回信息。从根元素开始,一级一级向下查找,不能跨级。

相对路径:./子元素/孙元素。先得到当前节点,再采用相对路径获取下一级节点的子节点并返回信息。从当前元素开始,一级一级向下查找,不能跨级。

全文检索:直接全文搜索所有的指定元素并返回

属性查找:在全文中搜索属性,或者带属性的元素

接下来我们还是看一段代码:

xml文件:

<?xml version="1.0" encoding="UTF-8"?>



潘金莲

panpan@qq.cn


武松

wusong@qq.cn


武大狼

wuda@qq.cn




我是西门庆



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
测试绝对路径:

/**
 1.绝对路径: /根元素/子元素/子子元素。
 */
@Test
public void parse01() throws Exception {
    // a、创建解析器对象
    SAXReader saxReader = new SAXReader();
    // b、把XML加载成Document文档对象
    Document document = saxReader.read(Dom4jWithXPath.class.getClassLoader().getResourceAsStream("xpathtest.xml"));
    // c、检索全部的名称
    List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
    for (Node nameNode : nameNodes) {
        Element  nameEle = (Element) nameNode;
        System.out.println(nameEle.getTextTrim());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

测试相对路径:

/**
 2.相对路径: ./子元素/子元素。 (.代表了当前元素)
 */
@Test
public void parse02() throws Exception {
    // a、创建解析器对象
    SAXReader saxReader = new SAXReader();
    // b、把XML加载成Document文档对象
    Document document =
            saxReader.read(Dom4jWithXPath.class.getClassLoader().getResourceAsStream("xpathtest.xml"));
    Element root = document.getRootElement();
    // c、检索全部的名称
    List<Node> nameNodes = root.selectNodes("./contact/name");
    for (Node nameNode : nameNodes) {
        Element  nameEle = (Element) nameNode;
        System.out.println(nameEle.getTextTrim());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
结果和上面一样

测试全文搜索:

/**
 3.全文搜索:
 //元素  在全文找这个元素
 //元素1/元素2  在全文找元素1下面的一级元素2
 //元素1//元素2  在全文找元素1下面的全部元素2
 */
@Test
public void parse03() throws Exception {
    // a、创建解析器对象
    SAXReader saxReader = new SAXReader();
    // b、把XML加载成Document文档对象
    Document document =
            saxReader.read(Dom4jWithXPath.class.getClassLoader().getResourceAsStream("xpathtest.xml"));
    // c、检索数据
    //List<Node> nameNodes = document.selectNodes("//name");
    // List<Node> nameNodes = document.selectNodes("//contact/name");
    List<Node> nameNodes = document.selectNodes("//contact//name");
    for (Node nameNode : nameNodes) {
        Element  nameEle = (Element) nameNode;
        System.out.println(nameEle.getTextTrim());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

测试属性查找:

/**
 4.属性查找。
 //@属性名称  在全文检索属性对象。
 //元素[@属性名称]  在全文检索包含该属性的元素对象。
 //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
 */
@Test
public void parse04() throws Exception {
    // a、创建解析器对象
    SAXReader saxReader = new SAXReader();
    // b、把XML加载成Document文档对象
    Document document =
            saxReader.read(Dom4jWithXPath.class.getClassLoader().getResourceAsStream("xpathtest.xml"));
    // c、检索数据
    List<Node> nodes = document.selectNodes("//@id");
    for (Node node : nodes) {
        Attribute attr = (Attribute) node;
        System.out.println(attr.getName() + "===>" + attr.getValue());
    }

    // 查询name元素(包含id属性的)

// Node node = document.selectSingleNode("//name[@id]");
Node node = document.selectSingleNode("//name[@id=888]");
Element ele = (Element) node;
System.out.println(ele.getTextTrim());
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

————————————————
版权声明:本文为CSDN博主「十八岁讨厌编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyb18507175502/article/details/131773177

目录
相关文章
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
692 57
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3354 1
|
11月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
481 0
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
578 13
用深度学习提升DOM解析——自动提取页面关键区块
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
676 15
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
2142 62
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
563 0
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
970 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1619 29

推荐镜像

更多
  • DNS