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

Java DOM 解析實戰:XML 文檔與 DOM 模型雙向轉換完整指南

     編輯:Java 程式設計入門

文檔對象模型(DOM)是 W3C 制定的平台無關、語言中立的 XML/HTML 编程接口標準。它將 XML 文檔在內存中構建為一棵節點樹,使開發者能以結構化方式訪問、遍歷、修改文檔內容。本文將系統講解 DOM 核心概念、邏輯結構、Java API 映射,並通過完整實例演示 XML 文件與 DOM 文檔的互相轉換、遍歷、修改全流程。

一、DOM 核心概念與邏輯結構

1.1 什麼是 DOM?

DOM(Document Object Model)將 XML 文檔解析為內存中的樹狀結構。每個 XML 元素、屬性、文本、註釋均對應一個節點對象。樹的根節點為 Document 節點,擁有唯一的根元素節點(Element),下掛各類子節點(Element, Text, Comment, ProcessingInstruction 等)。

1.2 節點類型速查表

常量名數值描述
ELEMENT_NODE1元素節點
ATTRIBUTE_NODE2屬性節點
TEXT_NODE3文本節點
COMMENT_NODE8註釋節點
DOCUMENT_NODE9文檔節點(根)

二、Java 中的 DOM API 包結構

  • org.w3c.dom:核心接口(Document, Node, NodeList, Element, Text 等)
  • javax.xml.parsers:解析器工廠(DocumentBuilderFactory, DocumentBuilder)
  • javax.xml.transform:轉換引擎(TransformerFactory, Transformer, DOMSource, StreamResult)

三、四大核心操作實戰代碼

3.1 XML 文件 → DOM 文檔(解析)

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("books.xml")); // 拋出 SAXException, IOException

關鍵點: DocumentBuilderFactory 可配置命名空間感知、驗證模式等特性;parse() 方法支援 File, InputStream, InputSource 多種輸入源。

3.2 DOM 文檔遍歷(遞歸深度優先)

public void traverse(NodeList nodeList) {
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        short type = node.getNodeType();
        if (type == Node.ELEMENT_NODE) {
            System.out.println("元素: " + node.getNodeName());
        } else if (type == Node.TEXT_NODE && node.getNodeValue().trim().length() > 0) {
            System.out.println("  文本: " + node.getNodeValue().trim());
        }
        if (node.hasChildNodes()) {
            traverse(node.getChildNodes()); // 遞歸處理子節點
        }
    }
}
// 調用入口
Element root = document.getDocumentElement();
traverse(root.getChildNodes());

3.3 DOM 文檔修改(新增節點)

Element root = document.getDocumentElement();

// 創建新書籍元素
Element book = document.createElement("book");
book.setAttribute("id", "bk101");

// 子元素:書名
Element title = document.createElement("title");
title.appendChild(document.createTextNode("Effective Java"));
book.appendChild(title);

// 子元素:作者
Element author = document.createElement("author");
author.appendChild(document.createTextNode("Joshua Bloch"));
book.appendChild(author);

// 掛載到根節點
root.appendChild(book);

注意: 所有節點創建必須通過 Document 對象的工廠方法(createElement, createTextNode 等),不可直接 new 實現類。

3.4 DOM 文檔 → XML 文件(序列化)

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 縮進美化
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("books_updated.xml"));
transformer.transform(source, result);

輸出目標除文件外,亦可為 StringWriter、System.out、網絡流等任意 Result 實現。

四、常見坑點與優化建議

  1. 內存佔用大:DOM 將整個文檔載入內存,不適用於超大 XML(>50MB)。大文件請改用 SAX 或 StAX 流式解析。
  2. 命名空間處理:解析帶命名空間的 XML 時,需開啟 factory.setNamespaceAware(true),並在 XPath/XQuery 中正確聲明前綴。
  3. 空白文本節點:格式化 XML 中的換行縮進會產生大量 TEXT_NODE,遍歷時建議過濾 node.getNodeValue().trim().isEmpty()。
  4. 異常處理:解析、轉換過程可能拋出 ParserConfigurationException, SAXException, TransformerException,務必統一捕獲並記錄日誌。

五、總結

DOM 模型以樹結構直觀映射 XML 文檔,提供隨機訪問、雙向修改能力,是中小型 XML 處理的首選方案。掌握 DocumentBuilder 解析、Node 遍歷、Document 工廠方法修改、Transformer 序列化四大核心環節,即可輕鬆實現 Java 與 XML 數據的無縫互通。實際項目中,建議封裝通用工具類(如 DomUtils.parse(), DomUtils.toXmlString()),統一異常處理、編碼設置、格式化輸出,提升開發效率與代碼健壯性。

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