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

Java XML 解析四大技術全對比:DOM、SAX、JDOM、DOM4J 實戰指南

     編輯:Java 綜合教學

XML 解析與生成:四大主流 API 深度實戰

在 Java 生態中處理 XML,核心面臨兩大任務:解析與生成。主流方案分為標準庫與第三方庫兩大陣營:

  • DOM (Document Object Model):樹形模型,一次性載入整個文檔到內存,適合小文檔、需隨機訪問、頻繁修改的場景。
  • SAX (Simple API for XML):事件驅動流式解析,不佔用文檔樹內存,適合大文檔、單次順序讀取、內存敏感場景。
  • JDOM:Java 原生優化的 DOM 封裝,API 更符合 Java 慣用法(集合、泛型),性能優於標準 DOM。
  • DOM4J:功能最豐富、性能最優的第三方庫,支持 XPath、XSLT、大文檔流式寫入,企業級首選。

一、環境準備

引入依賴(Maven 坐標示例):

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom2</artifactId>
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

標準庫 javax.xml.parsers、org.w3c.dom、org.xml.sax 無需額外引入。

二、DOM:標準樹形操作

解析

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
NodeList books = doc.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
    Element book = (Element) books.item(i);
    String id = book.getAttribute("id");
    NodeList children = book.getChildNodes();
    for (int k = 0; k < children.getLength(); k++) {
        if (children.item(k).getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(children.item(k).getNodeName() + ": " + children.item(k).getTextContent());
        }
    }
}

生成

Document doc = builder.newDocument();
Element root = doc.createElement("bookstore");
Element book = doc.createElement("book");
book.setAttribute("id", "1");
Element name = doc.createElement("name");
name.setTextContent("小王子");
book.appendChild(name);
root.appendChild(book);
doc.appendChild(root);

TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer transformer = tfFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(new File("out.xml")));

三、SAX:事件驅動流式處理

核心 Handler 實現

public class BookHandler extends DefaultHandler {
    private List<Book> books = new ArrayList<>();
    private Book current;
    private StringBuilder text = new StringBuilder();
    @Override public void startElement(String uri, String local, String qName, Attributes attrs) {
        if ("book".equals(qName)) { current = new Book(); current.setId(attrs.getValue("id")); }
        text.setLength(0);
    }
    @Override public void characters(char[] ch, int start, int len) { text.append(ch, start, len); }
    @Override public void endElement(String uri, String local, String qName) {
        if (current == null) return;
        switch (qName) {
            case "name": current.setName(text.toString()); break;
            case "author": current.setAuthor(text.toString()); break;
            // ... 其他字段
            case "book": books.add(current); current = null; break;
        }
    }
    public List<Book> getBooks() { return books; }
}

解析調用

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
BookHandler handler = new BookHandler();
parser.parse(new File("books.xml"), handler);

生成 XML (TransformerHandler)

SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler handler = tf.newTransformerHandler();
Transformer tr = handler.getTransformer();
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tr.setOutputProperty(OutputKeys.INDENT, "yes");
handler.setResult(new StreamResult(new FileOutputStream("sax_out.xml")));
handler.startDocument();
AttributesImpl attrs = new AttributesImpl();
handler.startElement("", "", "bookstore", attrs);
for (Book b : books) {
    attrs.clear(); attrs.addAttribute("", "", "id", "", b.getId());
    handler.startElement("", "", "book", attrs);
    // 依次寫入 name、author 等子元素
    handler.endElement("", "", "book");
}
handler.endElement("", "", "bookstore");
handler.endDocument();

四、JDOM:Java 風格的 DOM 增強

解析

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new FileInputStream("books.xml"));
Element root = doc.getRootElement();
List<Element> books = root.getChildren();
for (Element book : books) {
    String id = book.getAttributeValue("id");
    for (Element child : book.getChildren()) {
        String name = child.getName(), value = child.getValue();
        // 映射到 Book 對象
    }
}

生成

Element rss = new Element("rss").setAttribute("version", "2.0");
Document doc = new Document(rss);
Element channel = new Element("channel");
rss.addContent(channel);
channel.addContent(new Element("title").setText("國內國際新聞"));
Format format = Format.getPrettyFormat();
format.setEncoding("GBK");
new XMLOutputter(format).output(doc, new FileOutputStream("jdom_out.xml"));

五、DOM4J:企業級首選

解析

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("books.xml"));
Element root = doc.getRootElement();
for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
    Element book = it.next();
    for (Attribute attr : book.attributes()) {
        System.out.println(attr.getName() + "=" + attr.getValue());
    }
    for (Iterator<Element> it2 = book.elementIterator(); it2.hasNext(); ) {
        Element child = it2.next();
        System.out.println(child.getName() + "=" + child.getStringValue());
    }
}

生成

Document doc = DocumentHelper.createDocument();
Element rss = doc.addElement("rss").addAttribute("version", "2.0");
Element channel = rss.addElement("channel");
channel.addElement("title").setText("國內最新新聞");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileOutputStream("dom4j_out.xml"), format);
writer.write(doc); writer.close();

六、性能基準測試參考

典型 1MB XML 文件解析耗時(僅供參考,視機器而定):

  • DOM:~120 ms(內存峰值高)
  • SAX:~45 ms(內存穩定)
  • JDOM:~60 ms
  • DOM4J:~40 ms(最快,支持 XPath 查詢)

選型建議:

  • 配置文件、小數據交互 → DOM/JDOM
  • 大文件、高吞吐、內存受限 → SAX/DOM4J
  • 需 XPath、XSLT、複雜查詢 → DOM4J
  • Android/舊版 Java 環境 → 標準 DOM/SAX
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved