DOM(Document Object Model)將 XML 文檔視為一棵節點樹,每個元素、屬性、文本都是節點。PHP 內建 DOMDocument 類提供了標準的 DOM API,支援對 XML 進行增刪改查(CRUD)。本文以 class.xml 為例,帶你從樹結構認知走到代碼實戰。
class.xml<?xml version="1.0" encoding="utf-8"?>
<class>
<student info="美女">
<name>小喬</name>
<sex>女</sex>
<age>20</age>
</student>
<student>
<name>周瑜</name>
<sex>男</sex>
<age>25</age>
</student>
</class>

DOMDocument:整個文檔,也是根節點容器DOMElement:元素節點(如 <student>),擁有屬性與子節點DOMNodeList:getElementsByTagName 返回的節點列表,可遍歷、按索引取值DOMAttr:屬性節點(如 info="美女")DOMText:文本節點(標籤內的文字)<?php
// 1. 建立文檔物件並載入
$xmldoc = new DOMDocument();
$xmldoc->load("class.xml"); // 或 loadXML($string)
// 2. 定位目標節點
$students = $xmldoc->getElementsByTagName("student"); // DOMNodeList
echo "共有 {$students->length} 個學生<br>";
// 3. 取值
$stu1 = $students->item(0); // 第一個 student (DOMElement)
$nameNode = $stu1->getElementsByTagName("name")->item(0);
echo $nameNode->nodeValue; // 輸出:小喬
?>
若確定結構唯一,可直接搜尋 name:
$names = $xmldoc->getElementsByTagName("name");
echo $names->item(0)->nodeValue; // 小喬
echo $names->item(1)->nodeValue; // 周瑜
注意:若同一 student 下有多個 name,直接搜尋會導致順序混淆,此時需配合 XPath(DOMXPath)精準定位。
load() 自動識別 XML 聲明編碼;若載入字串用 loadXML(),確保字串為 UTF-8,否則中文會亂碼。DOMText 節點,遍歷 childNodes 時需過濾 nodeType === XML_TEXT_NODE && trim($node->nodeValue) === ''。nodeType、nodeName、nodeValue、attributes,對照 官方手冊 選擇正確 API。DOM 解析將 XML 載入記憶體,適合中小型文檔(< 10MB)的隨機存取與修改。大文件建議改用 XMLReader(流式拉取)或 SimpleXML(更簡潔的物件映射)。掌握 DOMDocument、DOMElement、DOMNodeList 三大核心類的協作,即可輕鬆完成 XML 讀取任務。