Dom4j解析XML(详解)

Dom4j解析XML(详解)Dom4j解析XML(详解)DOM解析SAX解析使用Dom4j解析XML结合XPath解析XML

大家好,又见面了,我是你们的朋友全栈君。

1.XML解析的方式介绍

在日常开发中常见的XML解析方式有如下两种:

1.DOM解析

DOM解析要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。
1.优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作。
2.缺点:如果XML文件过大,可能会导致内存溢出。

2.SAX解析

SAX解析是一种更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以时间驱动的方式进行具体的解析,每解析一行都会触发一个事件。
1.优点:不会出现内存溢出的问题,可以处理大文件。
2.缺点:只能读,不能写。

3.常见的解析XML类库

解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。具体如下所示:
1.dom4j:比较简单的XML解析类库;
2.Jsoup:功能强大的DOM方式解析的类库,尤其对HTML的解析更加方便,所以可以使用Jsoup来爬取网页的数据。

2.使用dom4j解析XML

1.创建普通的Maven项目

打开IDEA编译器,在导航栏选择文件,接下来点击新建 ,然后选择项目。点击后出现如图所示的界面:
在这里插入图片描述
选择创建一个普通的Maven项目,直接点击下一步即可。接下来自定义项目的名称,位置以及工作坐标。具体如下所示:
在这里插入图片描述
点击完成后,IDEA便开始加载项目。

2.导入dom4j的依赖

在加载后的项目下,找到pom.xml文件,将依赖导入其中,具体依赖如下所示:

<dependencies>
            <dependency>
                <groupId>org.dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>2.1.1</version>
            </dependency>
    </dependencies>

3.使用dom4j解析user.xml

使用dom4j解析user.xml的步骤如下所示:
在项目的resource目录下创建user.xml文件;
在下面user.xml文件中,users是根标签,根标签是全局唯一的;
在根标签下有两个user子标签,每一个user子标签都有两个属性,一个是country,另一个是source;在user标签下同样有三个子标签,分别是id,name以及password标签,具体如下所示:
1.编写user.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--文档声明 XML的文档声明是可选的,也就是可以不写,但是日常生活开发中大家都会写 XML文档声明如果写了,它必须放在XML文档的第一行第一列,必须以<?xml开头 以?>结尾,而且必须包含两个属性 一个是version,表示XML的版本 一个是encoding,表示XML的编码 -->
<!-- 元素是XML的重要组成部分,元素也被称为标签 每个XML文件必须要有一个根标签 标签有开始标签和结束标签组成,开始标签和结束标签可以写标签,也可以是文本字符串 标签可以嵌套使用,但是不能随便嵌套 标签名必须准守命名规则和命名规范 -->
<!-- 属性是标签的组成部分,属性只能定义在开始标签中,不能定义在结束标签中 属性定义的格式:属性名=属性值,属性值需要使用""包含起来 开始标签中可以定义多个属性,但是多个属性的属性名不能相同 属性名必须准守命名规则和命名规范 -->
<users>
    <user id="10001" country="Chinese" source="Android">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
    </user>

    <user id="10002" country="Chinese" source="ios">
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
    </user>

</users>

2.创建解析器对象

//创建解析器对象
        SAXReader saxReader=new SAXReader();

3.使用解析器对象读取XML文档生成Document对象

//根据user.xml文档生成Document对象
Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("users.xml"));

4.根据Document对象获取XML的元素(标签)信息
Dom4j的常用API说明:

方法 操作
Element getRootElement(); 获取XML文件的根节点
String getName(); 返回标签的名称
List < Element > elements(); 获取标签所有的子标签
String arrtributeVallue(String name) ; 获取指定属性名称的属性值
String getText(); 获取标签的文本
String elementText(String name); 获取指定名称的子标签的文本,返回子标签文本的值

具体的Dom4j解析的具体测试代码如下所示:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Dom4jParseUserXmlTest { 

public static void main(String[] args) { 

//创建解析器对象
SAXReader saxReader=new SAXReader();
try { 

Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("users.xml"));
Element rootElement = document.getRootElement();
System.out.println("1.------->users.xml文件的根节点的名字是:"+rootElement.getName());
System.out.println("2.------->获取根标签users的子标签列表");
List<Element> usersSubElementList = rootElement.elements();
for (Element userElement : usersSubElementList) { 

System.out.println("users标签的子标签的名字是"+ userElement.getName());
System.out.println("users标签的子标签的id属性值是"+ userElement.attributeValue("id"));
System.out.println("users标签的子标签的country属性值是"+ userElement.attributeValue("country"));
System.out.println("3.------->获取user的子标签列表");
List<Element> userSubElementList = userElement.elements();
for (Element userSubElement : userSubElementList) { 

System.out.println("user标签下的子标签名为:"+userSubElement.getName());
System.out.println("user标签下的子标签文本是:"+userSubElement.getText());
}
}
//获取users标签的第一个user标签
Element firstUserElement = rootElement.element("user");
//第一个user标签的子标签password的文本内容
String password = firstUserElement.attributeValue("password");
System.out.println(password);
} catch (DocumentException e) { 

e.printStackTrace();
}
}
}

3.dom4j结合XPath解析XML

1.Dom4j集成XPath

在pom.xml导入Xpath对应的依赖即可,具体如下所示:

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

2.Dom4j提供基于XPath的API

方法 操作
Node selectSingleNode(String xpathExpression); 根据XPath表达式获取单个标签(元素/节点)
List < Node > selectNodes(String xpathExpression) 根据XPath表达式获取多个标签(元素/节点)

3.XPath的语法

绝对路径表示方式:
以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如 /元素/子元素/子子元素……
相对路径的表达方式:
相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素./表示当前元素
全文搜索路径方式:
例如//子元素,//子元素//子子元素,//子元素/子子元素。
注意:
//表示无论中间有多少层,直接获取所有子元素所有满足条件的元素
/表示只找一层
谓语(条件筛选形式)
例如 : //元素[@attr1=value]

具体对应的每一种方式的Java测试程序如下所示:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Dom4jXPathParseUserXmlTest { 

public static void main(String[] args) { 

SAXReader saxReader=new SAXReader();
try { 

Document document= saxReader.read(Dom4jXPathParseUserXmlTest.class.getClassLoader().getResource("users.xml"));
//拿到第一个用户的密码
System.out.println("1.------>使用绝对路径方式来查找元素");
Element element = (Element) document.selectSingleNode("/users/user/password");
String password = element.getText();
System.out.println(password);
System.out.println("2.------>使用相对路径查找元素");
//element是当前获取的password元素
Element name = (Element) element.selectSingleNode("../name");
System.out.println("第一个用户的姓名为"+name.getText());
System.out.println("3.------>使用全局搜索的方式");
//获取所有的id元素的文本
List<Node> idNodeList = document.selectNodes("//id");
for (Node node : idNodeList) { 

Element idElement=(Element) node;
System.out.println(idElement.getText());
}
System.out.println("4.------>谓语形式");
//获取id=10002的用户信息
Element idElement = (Element) document.selectSingleNode("//user[@id='10002']");
List<Element> elements = idElement.elements();
for (Element element1 : elements) { 

System.out.println(element1.getName()+"="+element1.getText());
}
} catch (DocumentException e) { 

e.printStackTrace();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152025.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java (三) 常量

    Java (三) 常量   今天我们来记录一下java基础之常量,虽然这个很简单很简单,但是我还是喜欢记录下来,因为什么东西都是由开始的不会转变过来的,慢慢的积累最后都是财富,也能做到温故而知新,所以我也会坚持不管多简单或者多难。 1.常量:程序在执行过程中其值是不可以改变的量叫做常量。 2.Java中的常量:Java中常量是分两种的一种是字面值常量一种是面向对象常量,今天我要记载的是字面值常量。…

  • 时序数据库 mysql_时序数据库 应用场景

    时序数据库 mysql_时序数据库 应用场景influxDB介绍时间序列数据是以时间字段为每行数据的标示,比如股票市场的价格,环境中的温度,主机的CPU使用率等。但是又有什么数据是不包含timestamp的呢?几乎所有的数据都可以打上一个timestamp字段。时间序列数据更重要的一个属性是如何去查询它。在查询的时候,对于时间序列我们总是会带上一个时间范围去过滤数据。同时查询的结果里也总是会包含timestamp字段。InfluxDB是一…

  • 软件工程之软件设计③(概要设计说明书,详细设计说明书)

    软件工程之软件设计③(概要设计说明书,详细设计说明书)需求分析确定了系统的开发目标,下一步工作就是软件设计。软件设计可以进一步地分为两个阶段:总体设计和详细设计。总体设计又称概要设计,即确定系统的具体实现方案、给出软件的模块结构、编写总体设计说明书。详细设计又称过程设计,这一步的工作,就是要对系统中的每个模块给出足够详细的过程性描述。这种描述不是程序的书写,而是用一些工具来表示每个模块,所以这种描述是不…

  • mysql longtext 超时_限制MySQL SELECT结果中longtext字段的长度?

    mysql longtext 超时_限制MySQL SELECT结果中longtext字段的长度?您可以使用SUBSTRING()MySQL来限制字符串的长度。语法如下SELECTSUBSTRING(yourColumnName,1,yourIntegerValueToGetTheCharacters)asanyVariableNamefromyourTableName;为了理解上述语法,让我们创建一个表。创建表的查询如下mysql>createtablelimitLeng…

  • shell中各种括号的作用()、(())、[]、[[]]、{}「建议收藏」

    shell中各种括号的作用()、(())、[]、[[]]、{}「建议收藏」一、小括号,园括号()1、单小括号()①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将

  • Appium依据xpath获取控件实例随笔「建议收藏」

    Appium依据xpath获取控件实例随笔

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号