PHP 內建兩大 XML 解析工具:DOMDocument(樹狀結構、完整 DOM API)與 SimpleXML(簡易物件導向、記憶體較省)。本文以實際範例比較兩者讀取、查詢、迭代的寫法差異,助你選擇最適合的工具。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>天龍八部</title>
<author>金庸</author>
<price>350</price>
</book>
<book id="2">
<title>陸小鳳傳奇</title>
<author>古龍</author>
<price>280</price>
</book>
<book id="3">
<title>倚天屠龍記</title>
<author>金庸</author>
<price>320</price>
</book>
<book id="4">
<title>西遊記</title>
<author>吳承恩</author>
<price>300</price>
</book>
</books>
儲存為 books.xml。
XMLReader)getElementsByTagName、childNodes、item() 逐層存取<?php
$dom = new DOMDocument();
$dom->load('books.xml'); // 或 loadXML($xmlString)
$books = $dom->getElementsByTagName('book');
$results = [];
foreach ($books as $book) {
// 取得 author 節點
$authorNode = $book->getElementsByTagName('author')->item(0);
if ($authorNode && $authorNode->textContent === '金庸') {
$titleNode = $book->getElementsByTagName('title')->item(0);
if ($titleNode) {
$results[] = $titleNode->textContent;
}
}
}
print_r($results);
// Array ( [0] => 天龍八部 [1] => 倚天屠龍記 )
$xpath = new DOMXPath($dom);
// 直接查詢作者為金庸的 book 節點下的 title 文字
$titles = $xpath->query('//book[author="金庸"]/title');
$results = [];
foreach ($titles as $title) {
$results[] = $title->textContent;
}
print_r($results);
$xml->book[0]->titlexpath() 方法)、難以修改結構、大文件記憶體壓力大<?php
$xml = simplexml_load_file('books.xml'); // 或 simplexml_load_string()
$results = [];
foreach ($xml->book as $book) {
// 屬性存取:$book['id']
// 子元素存取:$book->title (回傳 SimpleXMLElement 物件)
if ((string)$book->author === '金庸') {
$results[] = (string)$book->title; // 強制轉字串
}
}
print_r($results);
// Array ( [0] => 天龍八部 [1] => 倚天屠龍記 )
$titles = $xml->xpath('//book[author="金庸"]/title');
$results = array_map('strval', $titles); // SimpleXMLElement 物件轉字串
print_r($results);
| 指標 | DOMDocument | SimpleXML |
|---|---|---|
| 記憶體峰值 | ~45 MB | ~30 MB |
| 載入時間 | 0.12 秒 | 0.08 秒 |
| XPath 查詢 | 0.005 秒 | 0.008 秒 |
| 修改/寫入支援 | 完整 | 有限 |
※ 實際數值視 XML 結構複雜度而異。超大檔(>100MB)建議改用 XMLReader 串流解析。
| 場景 | 推薦 | 理由 |
|---|---|---|
| 簡單讀取、結構固定、資料量中小 | SimpleXML | 程式碼最少、可讀性最高 |
| 需 XPath 複雜查詢、命名空間處理 | DOMDocument + DOMXPath | XPath 1.0 完整支援 |
| 需修改、新增、刪除節點並另存 | DOMDocument | 完整 DOM Level 3 API |
| 超大檔案、低記憶體環境 | XMLReader (SAX 風格) | 串流讀取,不載入整份文件 |
| 需序列化為 JSON 輸出 API | SimpleXML → json_encode | 物件結構直接對應 JSON |
DOMDocument 功能完整、適合複雜操作;SimpleXML 語法極簡、適合快速讀取。實務上常搭配使用:用 SimpleXML 快速原型開發,遇到複雜查詢或需修改 XML 時改用 DOMDocument + XPath。掌握兩者優劣,才能在不同專案需求中做出最佳選擇。