本文用最通俗的语言,把 dom4j 解析 XML 的流程、代码和坑点讲明白,新手也能直接上手跑通。
一、先搞懂:我们要做什么?
简单说:把写好的 XML 文件,用 Java 代码读出来,变成程序里能直接用的数据。
比如我们有个 students.xml,存了 3 个学生信息:
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="1">
<name>丽丽</name>
<age>19</age>
<sex>女</sex>
<score>89.6</score>
</student>
<student id="2">
<name>露露</name>
<age>21</age>
<sex>女</sex>
<score>73.6</score>
</student>
</students>
我们的目标就是:用 Java 把每个学生的 id、name、age 等数据都读出来,打印在控制台。
二、工具准备:dom4j 是什么?
dom4j 是一个专门给 Java 用的 XML 解析工具,比 JDK 自带的解析器好用太多,步骤清晰,代码好写。
怎么引入?
- 去官网 / Maven 仓库下载
dom4j-2.1.3.jar包 - 在项目里新建一个
lib文件夹,把 jar 包放进去 - 在 IDE 里把这个 jar 包添加为库依赖(IDEA 里右键
Add as Library就行)
三、核心流程:5 步读完 XML
我把整个解析过程拆成 5 步,每一步都像 “搭积木” 一样,一步一步来:
第 1 步:造个 “读取器”
SAXReader sr = new SAXReader();
大白话解释:
- 就像你要读一本书,得先拿个 “放大镜 / 阅读器” 一样,
SAXReader就是 dom4j 给我们准备好的 “XML 阅读器”。 - 它本质是个 “流”,负责把 XML 文件从硬盘读到内存里。
第 2 步:把 XML 读成 “文档对象”
Document dom = sr.read(new File("TestFirstModule/src/students.xml"));
大白话解释:
- 调用
read()方法,把你写好的 XML 文件路径传进去。 - 它会把整个 XML 文档一股脑加载到内存,封装成一个
Document对象 —— 你可以把它理解成 “内存里的 XML 文档副本”,之后所有操作都基于这个对象。 - ⚠️ 注意:路径一定要写对!写错了就会报 “找不到文件” 的错。
第 3 步:找到 “根节点”
Element studentsEle = dom.getRootElement();
大白话解释:
- XML 规定:一个文档只能有一个根节点,就像一棵树只能有一个树干。
- 我们的 XML 根节点是
<students>,所以getRootElement()会直接把这个<students>节点拿给我们。 - 后面所有学生数据,都要从这个根节点往下找。
第 4 步:遍历 “学生节点”
这一步是核心,分 3 小步:
4.1 拿到所有学生的迭代器
Iterator<Element> it1 = studentsEle.elementIterator();
elementIterator()会把根节点<students>下面所有<student>子节点,打包成一个 “迭代器”。- 迭代器就像一个 “排队的队伍”,我们可以用
while循环一个一个把学生 “叫出来”。
4.2 循环判断 + 取出学生
while (it1.hasNext()) {
Element studentEle = it1.next();
// ... 后面处理这个学生的数据
}
it1.hasNext():判断队伍里还有没有下一个学生(有就继续,没有就结束循环)it1.next():把当前这个学生节点取出来,同时 “队伍指针” 往后挪一位(下次再取就是下一个学生)
第 5 步:读学生的属性和子节点
拿到一个 studentEle(单个学生节点)后,我们要读两种数据:属性(比如 id="1")和子节点文本(比如 <name>丽丽</name>)。
5.1 读属性(比如 id)
List<Attribute> atts = studentEle.attributes();
for (Attribute a : atts) {
System.out.println("该子节点的属性: " + a.getName() + "---" + a.getText());
}
attributes():把这个学生节点上所有的属性(比如id)都拿出来,放进一个 List 里a.getName():拿到属性名(比如id)a.getText():拿到属性值(比如"1")
5.2 读子节点文本(比如 name/age)
Iterator<Element> it2 = studentEle.elementIterator();
while (it2.hasNext()) {
Element eles = it2.next();
System.out.println("节点: " + eles.getName() + "---" + eles.getText());
}
- 和刚才遍历学生一样,再套一层迭代器,遍历这个学生下面的
<name>、<age>等子节点 eles.getName():拿到节点名(比如name)eles.getText():拿到节点里的文本(比如"丽丽")
四、完整可跑代码(复制就能用)
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Attribute;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
import java.util.List;
public class TestXMLParse {
public static void main(String[] args) throws Exception {
// 1. 造阅读器
SAXReader sr = new SAXReader();
// 2. 读 XML 成文档对象
Document dom = sr.read(new File("TestFirstModule/src/students.xml"));
// 3. 拿根节点
Element studentsEle = dom.getRootElement();
// 4. 遍历所有学生
Iterator<Element> it1 = studentsEle.elementIterator();
while (it1.hasNext()) {
Element studentEle = it1.next();
// 4.1 读属性
List<Attribute> atts = studentEle.attributes();
for (Attribute a : atts) {
System.out.println("该子节点的属性: " + a.getName() + "---" + a.getText());
}
// 4.2 读子节点
Iterator<Element> it2 = studentEle.elementIterator();
while (it2.hasNext()) {
Element eles = it2.next();
System.out.println("节点: " + eles.getName() + "---" + eles.getText());
}
// 每个学生信息后换行,看着更清楚
System.out.println();
}
}
}
五、运行结果长这样
控制台会输出:
plaintext
该子节点的属性: id---1
节点: name---丽丽
节点: age---19
节点: sex---女
节点: score---89.6
该子节点的属性: id---2
节点: name---露露
节点: age---21
节点: sex---女
节点: score---73.6
完美!我们成功把 XML 里的数据都读出来了。
六、新手必踩的 3 个坑
- 路径写错:
new File("路径")一定要和你项目里 XML 的真实路径一致,IDEA 里可以右键 XML 选Copy Path/Reference复制绝对路径 - 没导包:一定要把
dom4j.jar加到项目依赖里,否则会报ClassNotFoundException - 大小写写错:XML 标签是大小写敏感的!
<student>和<Student>是两个完全不同的节点,代码里要和 XML 里写的一模一样
七、总结一下
用 dom4j 解析 XML 就 3 个核心动作:
- 读文档:
SAXReader→Document - 找根节点:
getRootElement() - 遍历节点:用
elementIterator()迭代器一层一层往下读,直到拿到你要的数据