基于Dom4j与XPath的XML解析实践

一、常见的XML解析方式

在日常开发中,常用的XML解析方式主要有两种:

  1. DOM(Document Object Model)

    • 原理:将整个XML文件加载到内存,构建成Document对象;

    • 优点:保留完整的节点结构,支持增删改查操作;

    • 缺点:占用内存较多,处理大文件时可能发生内存溢出;

  2. 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 解析流程

  1. 创建SAXReader解析器;

  2. 调用read()方法读取XML,生成Document对象;

  3. 通过DocumentElement 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());
}
  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录