文檔對象模型(DOM)是 W3C 制定的平台無關、語言中立的 XML/HTML 编程接口標準。它將 XML 文檔在內存中構建為一棵節點樹,使開發者能以結構化方式訪問、遍歷、修改文檔內容。本文將系統講解 DOM 核心概念、邏輯結構、Java API 映射,並通過完整實例演示 XML 文件與 DOM 文檔的互相轉換、遍歷、修改全流程。
DOM(Document Object Model)將 XML 文檔解析為內存中的樹狀結構。每個 XML 元素、屬性、文本、註釋均對應一個節點對象。樹的根節點為 Document 節點,擁有唯一的根元素節點(Element),下掛各類子節點(Element, Text, Comment, ProcessingInstruction 等)。
| 常量名 | 數值 | 描述 |
|---|---|---|
| ELEMENT_NODE | 1 | 元素節點 |
| ATTRIBUTE_NODE | 2 | 屬性節點 |
| TEXT_NODE | 3 | 文本節點 |
| COMMENT_NODE | 8 | 註釋節點 |
| DOCUMENT_NODE | 9 | 文檔節點(根) |
org.w3c.dom:核心接口(Document, Node, NodeList, Element, Text 等)javax.xml.parsers:解析器工廠(DocumentBuilderFactory, DocumentBuilder)javax.xml.transform:轉換引擎(TransformerFactory, Transformer, DOMSource, StreamResult)DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("books.xml")); // 拋出 SAXException, IOException
關鍵點: DocumentBuilderFactory 可配置命名空間感知、驗證模式等特性;parse() 方法支援 File, InputStream, InputSource 多種輸入源。
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());
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 實現類。
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 實現。
factory.setNamespaceAware(true),並在 XPath/XQuery 中正確聲明前綴。TEXT_NODE,遍歷時建議過濾 node.getNodeValue().trim().isEmpty()。ParserConfigurationException, SAXException, TransformerException,務必統一捕獲並記錄日誌。DOM 模型以樹結構直觀映射 XML 文檔,提供隨機訪問、雙向修改能力,是中小型 XML 處理的首選方案。掌握 DocumentBuilder 解析、Node 遍歷、Document 工廠方法修改、Transformer 序列化四大核心環節,即可輕鬆實現 Java 與 XML 數據的無縫互通。實際項目中,建議封裝通用工具類(如 DomUtils.parse(), DomUtils.toXmlString()),統一異常處理、編碼設置、格式化輸出,提升開發效率與代碼健壯性。