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

Java XML 解析四大主流方式完整對比:DOM、SAX、StAX、DOM4J

     編輯:Java 相關知識

XML 解析技術選型指南

Java 提供多種 XML 解析 API,各有適用場景。本文以統一範例 XML 展示四種主流方式的完整代碼與特性對比。

範例 XML (books.xml)

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
    <aa><bb><cc>ccccc</cc></bb></aa>
  </book>
  <book category="CHILDREN">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="WEB">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

1. DOM (Document Object Model) - 樹狀全量載入

import javax.xml.parsers.*;
import org.w3c.dom.Document;

public class DomParserDemo {
    public static void main(String[] args) throws Exception {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(DomParserDemo.class.getClassLoader().getResourceAsStream("books.xml"));
        System.out.println("根節點: " + doc.getDocumentElement().getNodeName()); // bookstore
    }
}
  • 優點:隨機存取、支援修改寫入、API 直觀
  • 缺點:記憶體佔用大,不適合大檔案 (>50MB)
  • 適用:小型配置檔、需頻繁修改結構的場景

2. SAX (Simple API for XML) - 事件驅動流式解析

import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;

public class SaxParserDemo {
    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        parser.parse(SaxParserDemo.class.getClassLoader().getResourceAsStream("books.xml"), 
            new DefaultHandler() {
                @Override public void startElement(String uri, String local, String qName, Attributes attrs) {
                    System.out.println("開始元素: " + qName);
                }
                @Override public void characters(char[] ch, int start, int length) {
                    System.out.println("文本內容: " + new String(ch, start, length).trim());
                }
                @Override public void endElement(String uri, String local, String qName) {
                    System.out.println("結束元素: " + qName);
                }
            });
    }
}
  • 優點:記憶體效率極高、適合超大檔案、單向流式
  • 缺點:唯讀、無隨機存取、需自行維護狀態(堆疊)
  • 適用:大型 XML 資料提取、單次遍歷場景

3. StAX (Streaming API for XML) - 拉取式流式解析

import javax.xml.stream.*;

public class StaxParserDemo {
    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newFactory();
        XMLStreamReader reader = factory.createXMLStreamReader(
            StaxParserDemo.class.getClassLoader().getResourceAsStream("books.xml"));
        
        while (reader.hasNext()) {
            int event = reader.next();
            switch (event) {
                case XMLStreamReader.START_ELEMENT:
                    System.out.println("開始: " + reader.getLocalName());
                    break;
                case XMLStreamReader.CHARACTERS:
                    if (reader.getText().trim().length() > 0)
                        System.out.println("文本: " + reader.getText());
                    break;
                case XMLStreamReader.END_ELEMENT:
                    System.out.println("結束: " + reader.getLocalName());
                    break;
            }
        }
    }
}
  • 優點:記憶體高效、程式控制流程(拉取)、可隨時停止
  • 缺點:API 較底層、唯讀
  • 適用:高效能流式處理、需精細控制解析邏輯

4. DOM4J - 易用性增強的 DOM 封裝 (需外部依賴)

import org.dom4j.Document;
import org.dom4j.io.SAXReader;

public class Dom4jParserDemo {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document doc = reader.read(Dom4jParserDemo.class.getClassLoader().getResourceAsStream("books.xml"));
        
        // XPath 查詢展示
        System.out.println("所有 cc 節點數: " + doc.selectNodes("//cc").size());
        System.out.println("有 author 子節點的 book 數: " + doc.selectNodes("//book[author]").size());
        System.out.println("有 category 屬性的 book 數: " + doc.selectNodes("//book[@category]").size());
        System.out.println("特定條件 book/price 數: " + 
            doc.selectNodes("//book[author='James McGovern'][@category='WEB']/price").size());
    }
}
  • 優點:XPath 強大查詢、API 友善、支援修改
  • 缺點:需額外 Jar、記憶體同 DOM
  • 適用:複雜查詢、企業級應用、配合 Hibernate 等框架

綜合對比表

維度DOMSAXStAXDOM4J
記憶體佔用高 (全樹)極低 (事件)極低 (流)高 (全樹)
解析速度中快快中
隨機存取支援不支援不支援支援
修改/寫入支援不支援不支援支援
XPath 查詢需額外庫不支援不支援原生支援
學習曲線低中中高低
依賴JDK 內建JDK 內建JDK 內建 (Java 6+)dom4j.jar

選型建議

  • 配置檔/小資料/需修改 → DOM 或 DOM4J
  • 超大檔案/單次提取/記憶體受限 → SAX 或 StAX
  • 複雜條件查詢/XPath → DOM4J
  • 現代替代:考慮 Jackson XML、JAXB (物件綁定)、或 Kotlinx.serialization
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved