基于Dom4j与XPath的XML解析实践
在日常开发中,常用的XML解析方式主要有两种:
DOM(Document Object Model)
原理:将整个XML文件加载到内存,构建成
Document
对象;优点:保留完整的节点结构,支持增删改查操作;
缺点:占用内存较多,处理大文件时可能发生内存溢出;
SAX(Simple API for XML)
原理:基于事件驱动,逐行读取并触发解析事件;
优点:低内存消耗,适合处理大文件;
缺点:只能读取,无法修改文档内容;
解析器根据不同解析方式提供实现,为简化开发,常用第三方库:
dom4j:轻量、易用;
Jsoup:强大的DOM解析库,对HTML解析尤为便捷;
二、使用Dom4j解析XML
2.1 集成依赖
<dependency>
<groupId>org.dom4jgroupId>
<artifactId>dom4jartifactId>
<version>2.1.4version>
dependency>
2.2 解析流程
创建
SAXReader
解析器;调用
read()
方法读取XML,生成Document
对象;通过
Document
和Element
API获取元素和属性;
2.3 核心API
Document getRootElement()
:获取根节点;String getName()
:节点名称;List
:所有子元素;elements() String attributeValue(String name)
:获取属性值;String getText()
:获取元素文本;String elementText(String name)
:获取指定子元素文本;
2.4 完整示例
SAXReader reader = new SAXReader();
Document doc = reader.read(getClass().getClassLoader().getResource("user.xml"));
Element root = doc.getRootElement();
System.out.println("根节点: " + root.getName());
for (Element user : root.elements("user")) {
System.out.printf("用户[id=%s, country=%s]: %n",
user.attributeValue("id"), user.attributeValue("country"));
for (Element field : user.elements()) {
System.out.printf(" %s = %s%n", field.getName(), field.getText());
}
}
// 获取第一个user的password
String pwd = root.element("user").elementText("password");
System.out.println("第一个用户密码: " + pwd);
三、Dom4j结合XPath解析
XPath可通过路径表达式快速定位元素或属性。
3.1 集成依赖
<dependency>
<groupId>jaxengroupId>
<artifactId>jaxenartifactId>
<version>2.0.0version>
dependency>
3.2 关键方法
Node selectSingleNode(String xpath)
:根据表达式选取单一节点;List
:根据表达式选取多个节点;selectNodes(String xpath)
3.3 常用XPath语法
绝对路径:
/users/user/password
;相对路径:
./salary
、../salary
;全文搜索:
//id
;谓语筛选:
//user[@id='U10001']
;
3.4 完整示例
SAXReader reader = new SAXReader();
Document doc = reader.read(getClass().getClassLoader().getResource("user.xml"));
// 绝对路径
Element pwd = (Element) doc.selectSingleNode("/users/user/password");
System.out.println("密码: " + pwd.getText());
// 相对路径
Element salary = (Element) pwd.selectSingleNode("../salary");
System.out.println("薪资: " + salary.getText());
// 全文搜索
for (Node idNode : doc.selectNodes("//id")) {
System.out.println("ID: " + ((Element) idNode).getText());
}
// 谓语筛选
Element user = (Element) doc.selectSingleNode("//user[@id='U10001']");
for (Element e : user.elements()) {
System.out.printf("%s = %s%n", e.getName(), e.getText());
}
- 微信
- 赶快加我聊天吧
- 赶快加我聊天吧