dom4j 是 Java 經典的 XML 處理庫,靈活支援 DOM 樹模型、SAX 流式解析與 XPath 查詢。本文系統講解三種核心用法,並提供字符串、文件、InputSource 多源解析示例,幫助開發者高效完成 XML 數據綁定與提取。
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
<!-- JAXP 實現,JDK 9+ 需額外引入 -->
<dependency>
<groupId>com.sun.xml.parsers</groupId>
<artifactId>jaxp-ri</artifactId>
<version>1.4.2</version>
</dependency>
適用於小型 XML 字符串,一次性載入內存樹,支援隨機訪問。
String xml = "<request><param name='service'>single_trade_query</param></request>";
// 1. 解析字符串
Document doc = DocumentHelper.parseText(xml);
// 2. 獲取根元素
Element root = doc.getRootElement();
// 3. 遍歷子元素
for (Element param : root.elements("param")) {
String name = param.attributeValue("name");
String value = param.getTextTrim();
System.out.println(name + " = " + value);
}
// 4. XPath 快速定位 (需 dom4j-xpath 模塊)
Node node = doc.selectSingleNode("//param[@name='service']");
System.out.println(node.getText()); // single_trade_query
適用於大文件,事件驅動,內存佔用極低,需實現自定義 Handler。
SAXReader reader = new SAXReader();
reader.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringReader("")); // 忽略 DTD
}
});
// 解析文件
Document doc = reader.read(new File("data.xml"));
// 解析字符串 (via InputSource)
InputSource src = new InputSource(new StringReader(xml));
src.setEncoding("UTF-8");
Document doc2 = reader.read(src);
引入 dom4j-xpath 依賴,使用 selectNodes/selectSingleNode 精準提取。
// 選擇所有 param 節點
List<Node> nodes = doc.selectNodes("//param");
for (Node n : nodes) {
System.out.println(n.getName() + ": " + n.getText());
}
// 選擇屬性值
String service = doc.valueOf("//param[@name='service']");
// 複雜條件:第 2 個 param 的值
String second = doc.valueOf("//param[2]");
Map<String,String> map = new HashMap<>(); map.put("ns", "https://example.com"); XPath xpath = doc.createXPath("//ns:element", map);xml:id="foo" 或 DTD 指定 ID 類型,才能用 doc.getNodeById("foo");普通 id 屬性不生效。OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(System.out, format); writer.write(doc);Document doc = DocumentHelper.createDocument(); Element root = doc.addElement("root"); root.addElement("child").addAttribute("k", "v").setText("content");DocumentException (解析錯誤) 與 InvalidXPathException (XPath 語法錯誤)。String callbackXml = "<xml>"
+ "<return_code>SUCCESS</return_code>"
+ "<result_code>SUCCESS</result_code>"
+ "<out_trade_no>202405201234</out_trade_no>"
+ "<total_fee>100</total_fee>"
+ "</xml>";
Document doc = DocumentHelper.parseText(callbackXml);
String outTradeNo = doc.valueOf("//out_trade_no");
int totalFee = Integer.parseInt(doc.valueOf("//total_fee"));
System.out.printf("訂單: %s, 金額: %d 分%n", outTradeNo, totalFee);
| 維度 | dom4j | JAXB | Jackson XML |
|---|---|---|---|
| 風格 | 動態樹操作 | 靜態綁定 (註解) | 流式/樹雙模式 |
| Schema 支援 | 弱 | 強 (XSD 生成類) | 中 |
| 大文件性能 | SAX 模式佳 | 需分塊 | 流式最優 |
| 適用場景 | 非結構化/臨時解析 | 固定結構/企業級集成 | 高性能/現代項目 |
dom4j 以靈活的 DOM/SAX/XPath 三合一 API 經受住了時間考驗。掌握 DocumentHelper.parseText 處理字符串、SAXReader 處理大文件、selectNodes 處理複雜查詢三大核心模式,即可應對 95% 的 XML 解析需求。新項目建議評估 Jackson XML 獲得更好性能與類型安全,但維護舊系統時 dom4j 依然是可靠選擇。