大白话讲 dom4j 解析 XML:从 0 到 1 搞定 Java 读取 XML

0 阅读4分钟

本文用最通俗的语言,把 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 把每个学生的 idnameage 等数据都读出来,打印在控制台。


二、工具准备:dom4j 是什么?

dom4j 是一个专门给 Java 用的 XML 解析工具,比 JDK 自带的解析器好用太多,步骤清晰,代码好写。

怎么引入?

  1. 去官网 / Maven 仓库下载 dom4j-2.1.3.jar
  2. 在项目里新建一个 lib 文件夹,把 jar 包放进去
  3. 在 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 个坑

  1. 路径写错new File("路径") 一定要和你项目里 XML 的真实路径一致,IDEA 里可以右键 XML 选 Copy Path/Reference 复制绝对路径
  2. 没导包:一定要把 dom4j.jar 加到项目依赖里,否则会报 ClassNotFoundException
  3. 大小写写错:XML 标签是大小写敏感的!<student><Student> 是两个完全不同的节点,代码里要和 XML 里写的一模一样

七、总结一下

用 dom4j 解析 XML 就 3 个核心动作:

  1. 读文档SAXReaderDocument
  2. 找根节点getRootElement()
  3. 遍历节点:用 elementIterator() 迭代器一层一层往下读,直到拿到你要的数据