dom4j新手易在命名空间、空元素、编码三处卡壳;中文乱码主因是saxreader未显式设utf-8编码;查不到xpath节点需注册命名空间前缀;换行缩进需同时设indent和newlines为true。

DOM4J 不适合新手直接上手解析复杂 XML,尤其当你要用 XPath 提取嵌套数据时,容易卡在命名空间、空元素、编码这三处。
DOM4J 读取 XML 文件时中文乱码怎么 fix
根本原因不是 DOM4J 本身,而是 SAXReader 默认用系统编码(Windows 是 GBK)读取 UTF-8 文件。不显式指定编码,Document 对象里文本就已损坏,后续 XPath 再准也白搭。
- 必须在创建
SAXReader后立刻调用setEncoding("UTF-8") - 如果 XML 声明里写了
<?xml version="1.0" encoding="GBK"?>,那就得改成匹配的编码,不能硬设 UTF-8 - 文件路径含中文?用
new FileInputStream(new File("路径"))比直接传字符串更稳,避免 URL 编码干扰
用 XPath 查不到节点?先看 namespace 和默认命名空间
DOM4J 的 selectNodes() 和 selectSingleNode() 对带命名空间的 XML 默认失效。比如 <body></body> 或 Spring 配置里常见的 xmlns="http://www.springframework.org/schema/beans",不注册前缀就查不到任何子元素。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
document.getRootElement().getNamespaceURI()看根节点有没有默认 namespace - 有就定义
Namespaces映射:Map<string string> ns = new HashMap(); ns.put("ns", "http://...");</string> - XPath 表达式写成
//ns:element,再传给selectNodes(xpath, ns) - 没 namespace 却还是查不到?检查是否用了
text()——element.selectSingleNode("name/text()")返回的是Text节点,不是Element,类型错了就拿不到值
写入 XML 时换行缩进失效?别信 OutputFormat.createPrettyPrint()
这个方法只控制格式化,但 DOM4J 默认关闭了输出换行——哪怕你设置了 pretty print,XMLWriter 仍可能把整个文档压成一行。
- 必须显式设置
format.setIndent(true)和format.setNewlines(true) - 如果写入后仍是单行,检查是否用了
write(document)而不是write(document.getRootElement())—— 前者会跳过 document 声明和格式控制 - 想保留 CDATA 或特殊字符?用
format.setExpandEmptyElements(false),否则<tag></tag>会被转成<tag></tag>
真正麻烦的从来不是语法,是 XML 里那些看不见的空格、BOM 头、混合命名空间和隐式编码。DOM4J 把底层细节藏得太深,一出问题就得一层层扒源码确认行为边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










