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

Java 與 XML 開發實戰:DOM 解析完整指南

     編輯:Java 程式設計入門

DOM (Document Object Model) 將 XML 文件載入記憶體形成樹狀結構,節點即物件,適合頻繁隨機存取、修改文件結構的場景。本文從 JAXP 標準 API 切入,完整示範解析、遍歷、建立 XML 的核心技術。

核心架構:JAXP + DOM

JAXP (Java API for XML Processing) 提供廠商中立的解析器介面,透過工廠模式隔離具體實作 (Xerces、Crimson 等)。核心三步驟:

// 1. 取得工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 取得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. 解析文件 -> Document 物件 (樹根)
Document doc = builder.parse("path/to/file.xml");

DOM 核心介面速覽

介面角色常用方法
Document整份文件根節點createElement、createTextNode、getElementsByTagName、getDocumentElement
Element標籤元素getAttribute、setAttribute、getElementsByTagName、appendChild
Node所有節點超介面getNodeType、getNodeName、getNodeValue、getFirstChild、getChildNodes、appendChild
NodeList節點有序集合getLength、item(index)
Attr屬性節點getName、getValue
Text文字內容節點getData、setData

實戰:讀取 XML 內容

範例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<messages>
  <message>Good-bye serialization, hello Java!</message>
</messages>

提取 <message> 文字:

NodeList list = doc.getElementsByTagName("message");
if (list.getLength() > 0) {
    Node msgNode = list.item(0);
    // 文字內容在第一個子節點 (Text 節點)
    String text = msgNode.getFirstChild().getNodeValue();
    System.out.println(text); // Good-bye serialization, hello Java!
}

關鍵: W3C 規範將元素內的文字也視為獨立的 Text 節點,故必須先 getFirstChild() 再取值。

實戰:建立與修改 XML

// 建立新文件
Document newDoc = builder.newDocument();
Element root = newDoc.createElement("books");
newDoc.appendChild(root);

Element book = newDoc.createElement("book");
book.setAttribute("isbn", "978-7-111-12345-6");
root.appendChild(book);

Element title = newDoc.createElement("title");
title.appendChild(newDoc.createTextNode("Effective Java"));
book.appendChild(title);

// 輸出為檔案 (需搭配 Transformer)
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(newDoc), new StreamResult(new File("books.xml")));

效能與適用場景

  • 優點:樹狀結構完整駐留記憶體,支援隨機存取、XPath 查詢、結構修改、雙向導航。
  • 缺點:記憶體消耗大,文件過大 (超過可用堆疊) 易導致 OOM;解析速度較 SAX/StAX 慢。
  • 適用:配置檔、小型資料交換、需頻繁修改結構的場景。
  • 不適用:超大 XML 流式處理、單向讀取、低記憶體環境 —— 請改用 SAX 或 StAX。

常見坑與最佳實踐

  1. 命名空間:啟用 factory.setNamespaceAware(true),查詢時使用 getElementsByTagNameNS。
  2. Text 節點分割:相鄰文字可能被拆分為多個 Text 節點,讀取前呼叫 element.normalize() 合併。
  3. 空白處理:factory.setIgnoringElementContentWhitespace(true) 需配合 DTD/Schema 驗證才生效。
  4. 編碼一致性:解析、輸出編碼需一致,建議統一 UTF-8。

掌握 DOM 操作是 Java XML 開發的基石,搭配 XPath (JAXP 1.3+) 更能如虎添翼。下一步可探索 SAX 事件驅動解析與 StAX 流式處理,構建完整 XML 技術棧。

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