文件物件模型(DOM)是 W3C 制定的標準程式介面,用於表示 HTML 與 XML 文件的邏輯結構。DOM 將文件解析為階層式節點樹,使開發者能以程式化方式存取、操作文件內容。自 JDK 1.4 起,Java 內建完整支援 DOM Level 2 Core 規範,提供豐富的 API 實現 XML 與 DOM 文件的雙向轉換。
DOM 文件以節點樹形式呈現,每個 XML 元素對應一個節點物件。核心節點類型包括:
透過節點間的父子關係,構建出完整的文件樹結構。
JDK 在三個主要套件提供 DOM 相關功能:
| 套件 | 核心類別/介面 | 用途 |
|---|---|---|
| org.w3c.dom | Document, Element, Node, NodeList, Text | DOM 文件操作核心介面 |
| javax.xml.parsers | DocumentBuilder, DocumentBuilderFactory | XML 解析器,將 XML 轉為 DOM |
| javax.xml.transform | Transformer, TransformerFactory, DOMSource, StreamResult | DOM 轉換輸出為 XML/HTML/文字 |
// 取得 XML 解析器工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 建立解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析 XML 檔案生成 DOM 文件
Document document = builder.parse(new File("example.xml"));
// 取得根元素
Element root = document.getDocumentElement();
// 取得子節點列表
NodeList nodeList = root.getChildNodes();
// 遞迴遍歷
traverseNodes(nodeList);
// 遞迴方法實作
public void traverseNodes(NodeList nodeList) {
if (nodeList.getLength() == 0) return;
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
short nodeType = node.getNodeType();
// 節點類型:1=Element, 3=Text
if (nodeType == Node.ELEMENT_NODE) {
System.out.println("元素: " + node.getNodeName());
} else if (nodeType == Node.TEXT_NODE) {
String text = node.getNodeValue().trim();
if (!text.isEmpty()) {
System.out.println("文字: " + text);
}
}
// 遞迴處理子節點
if (node.hasChildNodes()) {
traverseNodes(node.getChildNodes());
}
}
}
// 取得根元素
Element root = document.getDocumentElement();
// 建立新元素節點
Element bookType = document.createElement("BOOK_TYPE");
root.appendChild(bookType); // 加入根節點下
Element title = document.createElement("TITLE");
bookType.appendChild(title); // 加入 bookType 下
// 建立文字節點並設定內容
Text bookName = document.createTextNode("Java 程式設計入門");
title.appendChild(bookName); // 加入 title 下
// 建立轉換器
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
// 設定輸出來源(DOM 文件)與目標(XML 檔案)
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("output.xml"));
// 執行轉換
transformer.transform(source, result);
factory.setNamespaceAware(true)transformer.setOutputProperty(OutputKeys.INDENT, "yes") 產生縮排易讀的 XMLParserConfigurationException、SAXException、TransformerException 等異常掌握 DOM 與 XML 的雙向轉換技術,是 Java 處理設定檔、資料交換、文件產生等案例的基礎能力。結合 XPath 查詢、Schema 驗證等進階功能,可構建強健的 XML 處理方案。