技术:Java-Web基础|XML解析(四)之JAXP-dom4j

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。「XML」解析技术xml的解析技术:dom 和 sax。

1 XML介绍和解析方式


「XML解析介绍

XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。


2 dom4j解析XML

2.1 dom4j概述

Dom4j是一个组织,针对xml解析,提供解析器,dom4j后来独立成一个公司,他的性能比jdom更加强大。


我们如果想要使用Dom4j,需要引入dom4j提供依赖接口。在Maven项目中,导入依赖包很简单、容易。


2.2 引入dom4j依赖

首先在maven依赖仓库找到dom4j的依赖,然后将他拷贝到我们的pom.xml中。

「查找依赖包」

image.png

「导入到pom文件」

pom.xml

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
    </dependencies>


2.3 使用dom4j查询xml

首先创建persons.xml,我们还是使用上章节的文件。然后创建一个Dom4jParserXmlTest.java类。

「步骤」

1、创建解析器

2、获取Document对象

3、获取根元素

4、解析操作

    public static void main(String[] args) {
        String xmlPath = "./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml";
        // 1、创建解析器
        SAXReader saxReader = SAXReader.createDefault();
        try {
            // 2、获取Document对象
            Document document = saxReader.read(new File(xmlPath));
            // 3、获取根元素
            Element rootElement = document.getRootElement();
            // 4、解析操作
            System.out.println("输出全部xml:" + rootElement.asXML());
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

执行操作之后,我们可看到如下信息:

<persons>
  <person sid="001" uid="QS#123">
    <name>张小帅</name>
    <sex>男</sex>
    <age>28</age>
  </person>
  <person sid="002">
    <name>刘晓萌</name>
    <sex>女</sex>
    <age>21</age>
  </person>
  <person sid="003">
    <name>王老四</name>
    <sex>男</sex>
    <age>38</age>
  </person>
</persons>


Dom4j的常用API说明:

方法 操作


Element getRootElement(); 获取XML文件的根节点


String getName(); 返回标签的名称


List < Element > elements(); 获取标签所有的子标签


String arrtributeVallue(String name) ; 获取指定属性名称的属性值


String getText(); 获取标签的文本


String elementText(String name); 获取指定名称的子标签的文本,返回子标签文本的值


2.4 新增元素

Elementsex1=p1. addElement("content");

注意⚠️:这个操作与之前所说的操作和方法不一样,之前用jip时需要先创建,但现在不需要创建,直接在下面添加元素。


2.5 新增元素的文本

sex1.setText("测试");


2.6 回写到xml

方法一

OutputFormatformat=outputFormat.createPrettyPrint();

注意⚠️:可以有缩进的效果。这个方法是静态的,直接用outputFormat.createPrettyPrint进行格式化。


「方法二」

OutputFormatformat=outputFormat.createCompactFormat();

这个方法有压缩的效果,一般运用在计算机里,企业用第一种方法。


XMLWriterxmlwriter=newXMLWriter(newFileoutputstream("src/p1.xml"),format);
xmlWriter.write(document);

把内存中的数写入到文件里去,括号里传入document,这样就把文档传入到xml文件里去。


xmlWriter.close();

关流,注意流一旦打开就要关闭


3 dom4j结合XPath解析XML

3.1 引入jaxen依赖

同样,依赖第三方jar时,我们需要引入依赖包。

image.png

<!--https://mvnrepository.com/artifact/jaxen/jaxen --><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version></dependency>


3.2 使用XPath解析xml

Dom4j提供基于XPath的API

方法 操作


Node selectSingleNode(String xpathExpression); 根据XPath表达式获取单个标签(元素/节点)


List < Node > selectNodes(String xpathExpression) 根据XPath表达式获取多个标签(元素/节点)


「步骤」
1、获取解析器

2、获取Document对象

3、获取元素解析

publicstaticvoidmain(String[] args) {
StringxmlPath="./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml";
SAXReadersaxReader=newSAXReader();
try {
Documentdocument=saxReader.read(newFile(xmlPath));
// 拿到第一个用户的姓名System.out.println("1.------>使用绝对路径方式来查找元素");
Elementelement= (Element) document.selectSingleNode("/persons/person/name");
StringnameEle=element.getText();
System.out.println(nameEle);
System.out.println("2.------>使用相对路径查找元素");
// element是当前获取的name元素Elementname= (Element) element.selectSingleNode("../name");
System.out.println("第一个用户的姓名为"+name.getText());
System.out.println("3.------>使用全局搜索的方式");
//获取所有的id元素的文本List<Node>idNodeList=document.selectNodes("//sid");
for (Nodenode : idNodeList) {
ElementidElement=(Element) node;
System.out.println(idElement.getText());
            }
System.out.println("4.------>谓语形式");
//获取id=10002的用户信息ElementidElement= (Element) document.selectSingleNode("//person[@sid='002']");
List<Element>elements=idElement.elements();
for (Elementelement1 : elements) {
System.out.println(element1.getName()+"="+element1.getText());
            }
        } catch (DocumentExceptione) {
e.printStackTrace();
        }
    }

「解析后的结果」

1.------>使用绝对路径方式来查找元素
张小帅
2.------>使用相对路径查找元素
第一个用户的姓名为张小帅
3.------>使用全局搜索的方式
4.------>谓语形式
name=刘晓萌
sex=女
age=21

相关文章
|
3月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
378 1
|
2月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
180 0
|
9月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2150 1
|
7月前
|
存储 算法 安全
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
369 41
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
|
6月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
182 1
|
7月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
244 7
|
9月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
310 15
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
270 6
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
1064 11