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

Java XML 處理四大流派深度對比:DOM、SAX、JDOM、DOM4J 選型指南

     編輯:Java 相關知識

核心維度對比表

維度DOM (JAXP)SAXJDOMDOM4J
解析模式樹模型 (全量載入)事件驅動 (流式)樹模型 (Java 原生)樹模型 + 流式支援
記憶體佔用高 (整檔載入)極低 (逐事件處理)中高中 (支援大檔案流式)
隨機訪問支援 (XPath/導航)不支援 (單向)支援支援 (XPath 原生)
修改寫入容易困難 (需自建模型)容易容易
API 風格W3C 標準、介面導向回調/Handler 模式具體類、Collections 風格介面+抽象類、靈活豐富
學習曲線平緩陡峭平緩中等
性能 (10MB+)OOM 風險優秀OOM 風險優秀 (含流式)
命名空間支援支援支援支援
XPath 支援需額外庫無需額外庫內建
典型應用小檔案、頻繁修改、配置文件大檔案、單次讀取、數據提取中小專案、Java 原生偏好企業級、複雜 XML、Hibernate/JAXM 內部

四大流派代碼實戰對比:同一 XML 讀取任務

假設 XML 結構:



  A1234四川省XX縣
  B1234四川省XX市

1. DOM (JAXP Crimson) - 標準但冗長


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.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());
    System.out.println(e.getElementsByTagName("ADDR").item(0).getTextContent());
}

2. SAX - 事件驅動,邏輯分散


public class MyHandler extends DefaultHandler {
    private String currentTag;
    public void startElement(String uri, String local, String qName, Attributes attrs) {
        currentTag = qName;
    }
    public void characters(char[] ch, int start, int length) {
        String value = new String(ch, start, length);
        if ("NO".equals(currentTag)) System.out.print("車牌:" + value);
        if ("ADDR".equals(currentTag)) System.out.println(" 地址:" + value);
    }
}
// 使用
SAXParserFactory.newInstance().newSAXParser().parse(new File("data.xml"), new MyHandler());

3. JDOM - Java 原生風格,鏈式調用


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

4. DOM4J - 最優雅,XPath 一把梭


SAXReader reader = new SAXReader();
Document doc = reader.read(new File("data.xml"));
for (Element value : doc.selectNodes("//VALUE")) {
    System.out.println(value.elementText("NO") + " " + value.elementText("ADDR"));
}
// 或流式處理大檔案
reader.setFeature("https://apache.org/xml/features/nonvalidating/load-external-dtd", false);

選型決策樹

  1. 檔案 > 50MB 或記憶體受限 → SAX 或 DOM4J 流式模式 (StAX 也是選項)
  2. 需頻繁修改/寫入 XML → DOM4J (API 最豐富) 或 JDOM
  3. 需複雜 XPath 查詢 → DOM4J (內建) 或 DOM + javax.xml.xpath
  4. Android / 標準庫零依賴 → DOM/SAX (JAXP)
  5. 一般企業應用、配置文件、中小檔案 → DOM4J 首選 (Hibernate、Spring 內部均用之)
  6. 團隊偏好純 Java API、不想引入第三方包 → JDOM2 (現代化版本)

現代補充:StAX (JSR 173) 與 JAXB

  • StAX (Streaming API for XML):拉取式解析,兼具流式低記憶體與隨機訪問控制,JDK 6+ 內建,介於 SAX/DOM 之間。
  • JAXB (Java Architecture for XML Binding):XML↔Java 物件自動綁定,配置映射而非手寫解析,現代首選 (Spring Boot、Jakarta EE 標配)。

總結

DOM4J 綜合性能、功能、易用性長期稱霸 Java XML 處理;但現代開發應優先考慮 JAXB 綁定 或 Jackson XML 將 XML 轉為 POJO,僅在極少數動態結構、超大檔案、舊系統維護場景下直接操作底層解析器。

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