在Java开发中,Dom4j是常用的XML解析工具,相比其他解析方式,它的API更简洁,操作更灵活,适合处理各类XML文件读取需求。下面详细介绍使用Dom4j读取XML文件的具体方法。

环境准备
首先需要在项目中引入Dom4j的依赖,如果是Maven项目,在pom.xml中添加如下依赖:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>如果是普通Java项目,可以下载Dom4j的jar包,手动导入到项目的类路径中。
读取XML文件的核心步骤
使用Dom4j读取XML文件主要分为几个步骤:创建SAXReader对象、加载XML文件获取Document对象、获取根节点、遍历节点获取内容。下面通过一个示例详细说明。
准备测试XML文件
首先创建一个user.xml文件,内容如下:
<?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>编写读取代码
下面是完整的读取代码实现:
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 Dom4jReadXmlDemo {
public static void main(String[] args) {
// 1. 创建SAXReader对象
SAXReader saxReader = new SAXReader();
try {
// 2. 加载XML文件,获取Document对象
// 如果是web项目,也可以使用getResourceAsStream获取输入流
Document document = saxReader.read(new File("user.xml"));
// 3. 获取根节点
Element rootElement = document.getRootElement();
System.out.println("根节点名称:" + rootElement.getName());
// 4. 获取所有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");
// 获取email子节点的内容
String email = userElement.elementText("email");
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age + ",邮箱:" + email);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}代码说明
上述代码中,SAXReader是Dom4j提供的用于读取XML的核心类,read方法可以接收File、InputStream、URL等参数,适配不同的XML文件来源。Document对象代表整个XML文档,通过getRootElement方法可以获取根节点,之后可以通过elements方法获取指定名称的子节点集合,通过attributeValue获取节点属性,通过elementText获取子节点的文本内容。
常见场景处理
读取网络或指定路径的XML
如果需要读取网络上的XML或者指定路径的XML,可以修改read方法的参数,例如读取网址为http://ipipp.com/test.xml的内容:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.net.URL;
public class Dom4jReadUrlXmlDemo {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
// 读取指定URL的XML文件
Document document = saxReader.read(new URL("http://ipipp.com/test.xml"));
System.out.println("文档根节点:" + document.getRootElement().getName());
} catch (DocumentException e) {
e.printStackTrace();
}
}
}处理XML命名空间
如果XML文件带有命名空间,需要在SAXReader中设置命名空间感知,例如:
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 Dom4jNamespaceDemo {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
// 开启命名空间感知
saxReader.setNamespaceAware(true);
try {
Document document = saxReader.read(new File("namespace_xml.xml"));
Element rootElement = document.getRootElement();
// 获取带命名空间的子节点,需要指定命名空间
List<Element> elements = rootElement.elements(rootElement.getNamespaceForPrefix("ns") + "child");
System.out.println("子节点数量:" + elements.size());
} catch (DocumentException e) {
e.printStackTrace();
}
}
}注意事项
- 读取文件路径时,如果使用相对路径,是相对于项目的工作目录,而不是类文件所在目录,避免路径错误。
- 处理大XML文件时,Dom4j会将整个文档加载到内存,如果文件过大可能会导致内存溢出,此时可以考虑使用SAX方式的流式解析。
- 获取节点内容时,如果节点不存在,
elementText方法会返回null,需要做空值判断避免空指针异常。