首頁
編程語言
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,助你選型無憂。

一、四大解析器核心原理對比

1. DOM(Document Object Model)

  • 模型:樹形結構,一次性將整個 XML 載入內存構建 DOM 樹
  • 優點:支持隨機訪問、雙向遍歷、修改結構、編程直觀簡單
  • 缺點:內存佔用大,大文件易 OOM;解析慢
  • 適用:小文件、需頻繁修改結構、需反覆遍歷場景

2. SAX(Simple API for XML)

  • 模型:事件驅動流式解析,邊讀邊處理,不載入整樹
  • 優點:內存佔用極低、速度快、可中途停止解析
  • 缺點:單向只讀、無法隨機訪問、編程相對複雜(需自行維護狀態)
  • 適用:大文件、只需提取部分數據、內存受限環境

3. JDOM

  • 定位:Java 專用文檔模型,簡化 DOM API
  • 特點:僅用具體類不使用接口、大量使用 Collections API、學習曲線平緩
  • 缺點:性能一般、大文件仍易 OOM、靈活性受限
  • 適用:中小文件、追求開發效率、團隊熟悉 Java Collections

4. DOM4J

  • 定位:功能最全、性能最優的 Java XML API
  • 亮點:集成 XPath、XML Schema 支持、流式處理大文件、並行訪問(DOM4J API + 標準 DOM 接口)
  • 權衡:API 相對複雜、為靈活性犧牲了部分安全檢查
  • 生態:Hibernate、Sun JAXM 等知名項目採用
  • 適用:大多數企業級應用、需 XPath 查詢、大文件處理、追求性能

二、性能與選型決策表

場景推薦方案理由
大文件(>10MB)、內存敏感SAX / DOM4J 流式模式不全量載入內存
小文件、需頻繁增刪改查DOM / JDOM樹結構操作便捷
需 XPath、Schema 驗證、複雜查詢DOM4J原生支持 XPath、功能最全
跨語言項目、遵循 W3C 標準DOM官方標準、多語言通用
單純讀取、一次性遍歷SAX速度最快、內存最省

三、統一示例 XML

<?xml version="1.0" encoding="GB2312"?>
<RESULT>
  <VALUE>
    <NO>A1234</NO>
    <ADDR>XX號</ADDR>
  </VALUE>
  <VALUE>
    <NO>B1234</NO>
    <ADDR>XX組</ADDR>
  </VALUE>
</RESULT>

四、四種方式代碼實戰

1. DOM 解析

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("data.xml"));
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i = 0; i < nl.getLength(); i++) {
    System.out.println("車牌:" + doc.getElementsByTagName("NO").item(i).getTextContent());
    System.out.println("地址:" + doc.getElementsByTagName("ADDR").item(i).getTextContent());
}

2. SAX 解析

public class SaxHandler extends DefaultHandler {
    private String currentTag;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attrs) {
        currentTag = qName;
    }
    @Override
    public void characters(char[] ch, int start, int length) {
        String value = new String(ch, start, length);
        if ("NO".equals(currentTag)) System.out.print("車牌:" + value);
        else if ("ADDR".equals(currentTag)) System.out.println(" 地址:" + value);
    }
}

// 使用
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
sp.parse(new File("data.xml"), new SaxHandler());

3. JDOM 解析

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data.xml"));
Element root = doc.getRootElement();
List<Element> values = root.getChildren("VALUE");
for (Element v : values) {
    System.out.println("車牌:" + v.getChildText("NO"));
    System.out.println("地址:" + v.getChildText("ADDR"));
}

4. DOM4J 解析(推薦)

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

五、總結建議

  • 首選 DOM4J:功能最全、性能最優、生態成熟,適合 90% 企業級場景
  • 次選 JDOM:API 簡潔,適合中小項目快速開發
  • 特定場景用 DOM:需 W3C 標準兼容、跨語言、頻繁修改結構
  • 極大文件/流式處理用 SAX:內存極限環境、一次性讀取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved