Dom4j是Java生态中一款功能强大且易用的XML解析开源库,支持DOM、SAX等多种解析方式,能够高效处理XML文档的读取、修改、创建等操作,在配置文件解析、数据交换等场景中应用十分广泛。

Dom4j环境准备
在使用Dom4j之前,需要先将对应的依赖引入项目中。如果是Maven项目,可以在pom.xml中添加如下依赖:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
如果是普通Java项目,可以下载Dom4j的jar包,手动导入到项目的类路径中即可。
基础解析流程
使用Dom4j解析XML的核心步骤分为三步:创建SAXReader对象、读取XML文档获取Document对象、通过Document对象操作XML内容。下面通过一个简单的XML示例来演示完整流程。
待解析的XML文件test.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<hobby>篮球</hobby>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<hobby>阅读</hobby>
</user>
</users>
读取XML文档
首先通过SAXReader读取XML文件,得到Document对象,代码如下:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.io.File;
public class Dom4jDemo {
public static void main(String[] args) {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
try {
// 读取XML文件获取Document对象
Document document = reader.read(new File("test.xml"));
// 后续操作基于document展开
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
获取根节点与遍历子节点
Document对象可以获取到XML的根节点,之后可以通过根节点遍历所有子节点,获取节点的名称和文本内容:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class Dom4jDemo {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("test.xml"));
// 获取根节点
Element rootElement = document.getRootElement();
System.out.println("根节点名称:" + rootElement.getName());
// 获取所有user子节点
List<Element> userElements = rootElement.elements("user");
for (Element userElement : userElements) {
// 获取user节点的id属性
String id = userElement.attributeValue("id");
// 获取name子节点的文本
String name = userElement.elementText("name");
// 获取age子节点的文本
String age = userElement.elementText("age");
// 获取hobby子节点的文本
String hobby = userElement.elementText("hobby");
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age + ",爱好:" + hobby);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
上述代码的输出结果为:
根节点名称:users 用户ID:1,姓名:张三,年龄:25,爱好:篮球 用户ID:2,姓名:李四,年龄:28,爱好:阅读
常用操作扩展
修改XML节点内容
Dom4j也支持修改XML文档的内容,修改后可以通过XMLWriter将变更写入文件,示例代码如下:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
public class Dom4jUpdateDemo {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File("test.xml"));
Element rootElement = document.getRootElement();
// 获取第一个user节点
Element firstUser = (Element) rootElement.elements("user").get(0);
// 修改age节点的内容
Element ageElement = firstUser.element("age");
ageElement.setText("26");
// 设置输出格式,避免中文乱码
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 写入文件
XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format);
writer.write(document);
writer.close();
System.out.println("XML修改完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建新的XML文档
除了解析已有XML,Dom4j还可以创建全新的XML文档,代码如下:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
public class Dom4jCreateDemo {
public static void main(String[] args) {
try {
// 创建Document对象
Document document = DocumentHelper.createDocument();
// 创建根节点
Element root = document.addElement("books");
// 添加子节点
Element book = root.addElement("book")
.addAttribute("id", "1");
book.addElement("title").setText("Java编程思想");
book.addElement("author").setText("Bruce Eckel");
book.addElement("price").setText("108");
// 输出到文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("new_books.xml"), format);
writer.write(document);
writer.close();
System.out.println("新XML创建完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
- 读取XML文件时需要确保文件路径正确,避免抛出文件找不到的异常
- 修改XML写入文件时,需要设置正确的编码格式,防止中文内容出现乱码
- 操作节点前最好先判断节点是否存在,避免空指针异常
- 如果XML文档较大,建议使用SAX方式的流式解析,避免占用过多内存