Dom4j 的使用
一、Dom4j 的使用
1.XML解析的方式介绍
在日常开发中常见的XML解析方式有如下两种
- DOM:要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。
优点:元素和元素之间保留结构、关系,可以针对元素进行增删查改操作。
缺点:如果XML文件过大,可能会导致内存溢出。 - SAX:是一种速度更快,更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件。
优点:不会出现内存溢出的问题,可以处理大文件。
缺点:只能读,不能写。
解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。
dom4j:比较简单的XML解析的类库。
Jsoup:功能强大的DOM方式解析的类库,尤其对HTML的解析更加方便。
2.使用dom4j解析XML
java项目集成dom4j
- 定义版本
<dom4j.version>2.1.3</dom4j.version>
- 添加依赖管理
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
- 添加依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
使用dom4j解析user.xml
使用dom4j解析xml的步骤
- 创建解析器对象
- 使用解析器对象读取XML文档生成Document对象
- 根据Document对象获取XML的元素(标签)信息
Dom4j重要的API说明
- 创建解析器对象
SAXReader saxReader = new SAXReader();
Doucoment document = saxReader.read(Test.class.getClassLoader().getResource("user.xml");//Test.class(测试类),user.xml需要解析的xml文件
- org.dom4j.Docunmen常用方法
Element getRootElement();//获取根节点
String getName();//返回标签的名称
List<Element> elements();// 获取标签的子标签
String attributeValue(String name);//获取指定属性
String getText();//获取标签的文本
String elementText(String name);//获取指定名称的自标签的文本,返回子标签文本的值
总结:这样的方法一层层解析,一层层for循环,一个个去拿值,十分的麻烦不够灵活。所以就要使用下面的XPath进行xml的解析。
3.dom4j结合XPath解析XML
XPath可以使用路径表达式来选取XML文档中的元素或者属性节点,节点是沿着路径来选取的。
XPath的官方文档地址:https://zvon.org/xxl/XPathTutorial/General_chi/examples.html
dom4j集成XPath
- 定义版本
<jaxen.version>1.1.1</jaxen.version>
- 添加依赖管理
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>${jaxen.version}</version>
</dependency>
- 添加依赖
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
</dependency>
dom4j提供基于XPath的API
Doucument/Element关于XPath的api
Node selectSingleNode(String xpathExpression);//根据XPath获取单个标签(元素/节点)。
List<Node> selectNodes(String xpathExpression);//根据XPath获取多个标签(元素/节点)
XPath的语法
-
绝对路径表示方式:以/开头的路径表示绝对路径,绝对路径是从根元素开始写。
例如:元素/子元素/子子元素… -
相对路径方式:相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素,./表示当前元素。
-
全文搜索路径方式://表示无论中间有多少层,直接获取所有子元素满足条件的元素。
/表示只找一层。
例如://子元素,//子元素//子子元素,//子元素/子子元素。 -
谓语(条件筛选)形式 例如://元素[@attr1=‘value’]