一、XML解析 基础知识
1.1 XML解析种类
XML解析方式有4种,分别是:DOM解析、SAX解析、JDOM解析、DOM4j解析
。其中前两种属于基础方法,是官方提供的与平台无关的解析方式后两种属于扩展方法,是在基础方法上拓展出来的,只适用于java平台。
1、DOM解析:JDK中都自带了,无需再导包。要求解析器将整个XML文件全部加载到内存种,生成一个Document对象。
- 优点:元素和元素之间保留结构、关系,可以针对元素进行增删改查操作
- 缺点:XML文件过大,可能会导致内存溢出
2、SAX解析:是一种速度更快,更加高效的解析方式,它是逐行扫描
的,边扫描边解析
,并且以事件驱动的方式
来进行具体的解析,每解析一行都会触发一个事件。
- 优点:不会出现内存溢出的问题可以处理大文件
- 缺点:智能读,不能写
1.2 解析器
解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员解析XML,有一些方便操作的类库。
- dom4j:是比较简单的XML解析的类库
- Jsoup:是功能强大的DOM方式解析的类库,尤其是对HTML的解析更加方便
二、使用dom4j解析XML
2.1 搭建环境
创建一个
maven
项目
将项目的maven库改为本地仓库
加入依赖
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
在
resources
根目录下创建user.xml
文件,
并在user.xml
文件中添加如下内容
<?xml version="1.0" encoding="UTF-8" ?>
<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.2 解析XML文件
解析步骤介绍
1、创建解析器对象
//创建解析器对象
SAXReader saxReader = new SAXReader();
2、使用解析器对象读取XML文档生成Document对象
Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
3、根据Document对象获取XML的元素(标签信息)
//3.1 获取XML文件的根节点
Element rootElement = document.getRootElement();
System.out.println("user.xml文件的根节点的名字为"+rootElement.getName());
//3.2 获取XML文件的根节点下的子节点
System.out.println("获取根标签users的子标签列表");
List<Element> usersSubElementList = rootElement.elements();
for (Element userElement : usersSubElementList) {
//String attributeValue(String name);获取指定属性名称的属性值
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("users标签的子标签的sources属性值"+userElement.attributeValue("source"));
System.out.println("3、获取user的子标签列表");
创建名称为
Dom4jParseUserXmlTest
的类,并且添加如下内容,开始解析
package com.li.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
/**
* @author potential
*/
public class Dom4jParseUserXmlTest {
public static void main(String[] args) {
//1、创建解析器对象
SAXReader saxReader = new SAXReader();
//2、使用解析器对象读取XML文档生成Document对象
try {
Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
//3、根据Document对象获取XML的元素标签信息
/**
* 1、org.dom4j.Document常用方法
* Element getRootElement(); 获取XML文件的根节点
* 2、org.dom4j.Element常用方法
* String getName();返回
* List<Element>elements();获取标签的子标签
*/
//3.1 获取XML文件的根节点
Element rootElement = document.getRootElement();
System.out.println("user.xml文件的根节点的名字为"+rootElement.getName());
//3.2 获取XML文件的根节点下的子节点
System.out.println("获取根标签users的子标签列表");
List<Element> usersSubElementList = rootElement.elements();
for (Element userElement : usersSubElementList) {
//String attributeValue(String name);获取指定属性名称的属性值
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("users标签的子标签的sources属性值"+userElement.attributeValue("source"));
System.out.println("3、获取user的子标签列表");
List<Element> userSubElementList = userElement.elements();
for (Element userSubElement : userSubElementList) {
System.out.println("user标签下的子标签名字是"+userSubElement.getName());
//String getText();获取标签的文本
System.out.println("user标签下的子标签的文本是"+userSubElement.getText());
}
}
//获取users标签的第一个user标签
Element firstUserElement = rootElement.element("user");
//获取第一个user标签下的子标签password属性的文本
//String elementText(String name);获取指定名称的子标签的文本
String password = firstUserElement.elementText("password");
System.out.println("第一个user标签的子标签password的文本"+password);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
运行结果展示
2.3 dom4j重要API说明
org.dom4j.Document常用方法
Element getRootElement() | 获取XML文件的根节点 |
---|
org.dom4j.Element常用方法
String getName() | 返回元素名称 |
---|---|
Listelements() | 获取标签的子标签 |
String attributeValue(String name) | 获取指定属性名称的属性值 |
String getText() | 获取标签的文本 |
String elementText(String name) | 获取指定名称的子标签的文本 |