dom4j是一款开源的XML解析框架,基于Java集合框架设计,性能优异且使用灵活,支持DOM、SAX等多种解析模式,广泛应用于Java项目的XML数据处理场景中。本文将围绕dom4j的CRUD操作展开,通过具体代码示例说明完整的实现流程。

环境准备
在使用dom4j之前,需要先引入相关的依赖。如果是Maven项目,可以在pom.xml中添加以下依赖配置:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>如果是普通Java项目,可以下载dom4j的jar包,导入到项目的类路径中即可。
准备测试用的XML文件
我们先创建一个名为user.xml的测试文件,内容如下,后续的所有CRUD操作都会基于这个文件进行:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>读取XML文件(查询操作)
使用dom4j的SAXReader类可以加载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 Dom4jCRUDDemo {
public static void main(String[] args) throws DocumentException {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 加载XML文件,获取Document对象
Document document = reader.read(new File("user.xml"));
// 获取根节点
Element rootElement = document.getRootElement();
// 获取所有user子节点
List<Element> userElements = rootElement.elements("user");
// 遍历输出用户信息
for (Element userElement : userElements) {
// 获取id属性
String id = userElement.attributeValue("id");
// 获取name子节点的文本
String name = userElement.elementText("name");
// 获取age子节点的文本
String age = userElement.elementText("age");
// 获取email子节点的文本
String email = userElement.elementText("email");
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age + ",邮箱:" + email);
}
}
}新增XML节点(新增操作)
要新增一个用户节点,需要先创建对应的元素,设置属性和子节点内容,然后将其添加到根节点下,最后将修改后的文档写回文件。以下是新增用户节点的示例代码:
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;
import java.io.IOException;
public class AddUserDemo {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("user.xml"));
Element rootElement = document.getRootElement();
// 创建新的user节点
Element newUser = rootElement.addElement("user");
// 设置id属性
newUser.addAttribute("id", "3");
// 添加name子节点
Element nameElement = newUser.addElement("name");
nameElement.setText("王五");
// 添加age子节点
Element ageElement = newUser.addElement("age");
ageElement.setText("30");
// 添加email子节点
Element emailElement = newUser.addElement("email");
emailElement.setText("wangwu@ipipp.com");
// 设置输出格式,避免中文乱码,并且格式化输出
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 将修改后的文档写回文件
XMLWriter writer = new XMLWriter(new FileOutputStream("user.xml"), format);
writer.write(document);
writer.close();
System.out.println("用户新增成功");
}
}修改XML节点(修改操作)
修改XML节点的操作需要先找到目标节点,然后修改其属性或者子节点的文本内容,再写回文件。以下是将id为2的用户年龄修改为29的示例代码:
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;
import java.io.IOException;
import java.util.List;
public class UpdateUserDemo {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("user.xml"));
Element rootElement = document.getRootElement();
List<Element> userElements = rootElement.elements("user");
for (Element userElement : userElements) {
String id = userElement.attributeValue("id");
// 找到id为2的用户节点
if ("2".equals(id)) {
// 修改age子节点的文本
Element ageElement = userElement.element("age");
ageElement.setText("29");
// 修改email内容
Element emailElement = userElement.element("email");
emailElement.setText("lisi_update@ipipp.com");
break;
}
}
// 写回文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("user.xml"), format);
writer.write(document);
writer.close();
System.out.println("用户修改成功");
}
}删除XML节点(删除操作)
删除XML节点需要先定位到目标节点,然后通过父节点调用remove方法删除该节点,最后将修改后的文档写回文件。以下是删除id为1的用户节点的示例代码:
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;
import java.io.IOException;
import java.util.List;
public class DeleteUserDemo {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("user.xml"));
Element rootElement = document.getRootElement();
List<Element> userElements = rootElement.elements("user");
for (Element userElement : userElements) {
String id = userElement.attributeValue("id");
// 找到id为1的用户节点
if ("1".equals(id)) {
// 通过父节点删除当前节点
rootElement.remove(userElement);
break;
}
}
// 写回文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("user.xml"), format);
writer.write(document);
writer.close();
System.out.println("用户删除成功");
}
}注意事项
- 操作XML文件时,文件路径需要正确,避免文件找不到的异常。
- 写回文件时使用
OutputFormat设置编码和格式化,避免出现中文乱码或者文件格式混乱的问题。 - 遍历节点进行修改或者删除操作时,如果在遍历过程中直接删除集合中的元素,可能会出现异常,建议先找到目标节点再进行操作。
- dom4j的
elementText方法如果对应的子节点不存在会返回null,使用时需要做非空判断避免空指针异常。