首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java dom4j 解析 XML 完全指南:DOM、SAX、XPath 三大模式實戰

     編輯:Java 相關知識

前言

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>

模式一:DOM 模式 (DocumentHelper.parseText)

適用於小型 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

模式二:SAX 模式 (SAXReader)

適用於大文件,事件驅動,內存佔用極低,需實現自定義 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);

模式三:XPath 查詢 (推薦複雜結構)

引入 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]");

實用技巧集錦

  1. 命名空間處理:Map<String,String> map = new HashMap<>(); map.put("ns", "https://example.com"); XPath xpath = doc.createXPath("//ns:element", map);
  2. ID 定位:XML 元素需聲明 xml:id="foo" 或 DTD 指定 ID 類型,才能用 doc.getNodeById("foo");普通 id 屬性不生效。
  3. 輸出格式化:OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(System.out, format); writer.write(doc);
  4. 創建新文檔:Document doc = DocumentHelper.createDocument(); Element root = doc.addElement("root"); root.addElement("child").addAttribute("k", "v").setText("content");
  5. 異常處理:捕獲 DocumentException (解析錯誤) 與 InvalidXPathException (XPath 語法錯誤)。

完整示例:解析支付回調 XML

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 vs JAXB vs Jackson XML

維度dom4jJAXBJackson XML
風格動態樹操作靜態綁定 (註解)流式/樹雙模式
Schema 支援弱強 (XSD 生成類)中
大文件性能SAX 模式佳需分塊流式最優
適用場景非結構化/臨時解析固定結構/企業級集成高性能/現代項目

總結

dom4j 以靈活的 DOM/SAX/XPath 三合一 API 經受住了時間考驗。掌握 DocumentHelper.parseText 處理字符串、SAXReader 處理大文件、selectNodes 處理複雜查詢三大核心模式,即可應對 95% 的 XML 解析需求。新項目建議評估 Jackson XML 獲得更好性能與類型安全,但維護舊系統時 dom4j 依然是可靠選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved