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

Java 解析 XML 四大主流方案深度比較:DOM、SAX、JDOM、DOM4J

     編輯:Java 相關知識

前言

XML 仍是企業級整合、配置檔、報文交換的常見格式。Java 生態系提供多種解析器,各有優劣。本文系統比較 DOM、SAX、JDOM、DOM4J 四大方案的原理、效能、適用場景,並附完整程式碼範例助你快速選型。

核心架構比較

方案解析模型記憶體佔用速度易用度適合場景
DOM (JAXP)樹狀結構,一次載入整份文檔高(正比文檔大小)中高(API 直觀)小檔案、需隨機存取、頻繁修改結構
SAX事件驅動,串流式單向讀取極低(不載入樹)最快低(需自行維護狀態)大檔案、唯讀、單次遍歷、記憶體受限
JDOM樹狀,Java 原生 API(Collection、具體類)高中偏慢最高(語法簡潔)中小檔案、追求開發效率、不需 XPath
DOM4J樹狀 + 事件混合,支援 XPath、Schema中高(可選串流模式)最快(樹模式下)高(功能豐富)企業級專案、大檔案、需 XPath/Schema、Hibernate 等整合

詳細解析

1. DOM(Document Object Model)

  • 優點:W3C 標準、跨語言、支援完整 CRUD、隨機存取節點。
  • 缺點:大檔案易 OOM、效能隨文檔增長呈指數級下降。
  • 關鍵類:DocumentBuilderFactory、Document、NodeList。

2. SAX(Simple API for XML)

  • 優點:串流處理、常數記憶體、可中途停止解析。
  • 缺點:唯讀、無法回溯、程式碼較冗長(需自行堆疊標籤狀態)。
  • 關鍵介面:ContentHandler、DefaultHandler。

3. JDOM

  • 定位:Java 專用,簡化 DOM 操作,大量使用 List、Element 具體類而非介面。
  • 特色:SAXBuilder 建樹、XPath 支援較弱、輸出格式化簡單。
  • 現狀:維護較緩慢,新專案建議改用 DOM4J。

4. DOM4J

  • 優勢:效能最佳(Sun JAXM、Hibernate 均採用)、完整 XPath、XML Schema 驗證、支援 大檔案串流模式(SAXReader)、並行支援 DOM4J API 與標準 DOM 介面。
  • 權衡:API 較複雜(介面+抽象類)、引入第三方依賴。

實戰程式碼:同一 XML 讀取比較

<?xml version="1.0" encoding="GB2312"?>
<RESULT>
  <VALUE>
    <NO>A1234</NO>
    <ADDR>四川省XX縣XX鎮XX路X段XX號</ADDR>
  </VALUE>
  <VALUE>
    <NO>B1234</NO>
    <ADDR>四川省XX市XX鄉XX村XX組</ADDR>
  </VALUE>
</RESULT>

DOM 版

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
Document doc = f.newDocumentBuilder().parse(new File("data.xml"));
NodeList list = doc.getElementsByTagName("VALUE");
for (int i = 0; i < list.getLength(); i++) {
    Element e = (Element) list.item(i);
    System.out.println(e.getElementsByTagName("NO").item(0).getTextContent()
        + " | " + e.getElementsByTagName("ADDR").item(0).getTextContent());
}

SAX 版

public class SaxHandler extends DefaultHandler {
    private String currentTag;
    @Override public void startElement(String u, String l, String q, Attributes a) {
        currentTag = q;
    }
    @Override public void characters(char[] ch, int start, int len) {
        String val = new String(ch, start, len);
        if ("NO".equals(currentTag)) System.out.print("NO: " + val + " | ");
        else if ("ADDR".equals(currentTag)) System.out.println("ADDR: " + val);
    }
}
// 使用
SAXParserFactory.newInstance().newSAXParser().parse(new File("data.xml"), new SaxHandler());

JDOM 版

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data.xml"));
Element root = doc.getRootElement();
for (Element v : root.getChildren("VALUE")) {
    System.out.println(v.getChildText("NO") + " | " + v.getChildText("ADDR"));
}

DOM4J 版(推薦)

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("data.xml"));
for (Iterator<Element> it = doc.getRootElement().elementIterator("VALUE"); it.hasNext(); ) {
    Element v = it.next();
    System.out.println(v.elementText("NO") + " | " + v.elementText("ADDR"));
}

選型決策樹

  1. 檔案 > 50MB 或記憶體受限 → SAX 或 DOM4J 串流模式。
  2. 需 XPath、Schema 驗證、頻繁修改 → DOM4J。
  3. 小檔案、追求極致開發速度、團隊熟悉 Java Collection → JDOM。
  4. 跨語言標準、輕量修改 → DOM。

結語

現代 Java 專案中,DOM4J 仍是綜合表現最佳的選擇(Hibernate、Spring 內部皆採用)。若專案極度輕量或 Android 環境,可考慮標準 JAXP DOM/SAX 以避免額外依賴。理解四者核心差異,才能在效能與維護性間取得最佳平衡。

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