XML 在系統整合、配置管理、資料交換仍佔一席之地。PHP 提供兩大主流工具:XPath(路徑查詢語言)與 SimpleXML(物件導向封裝)。本文以實戰範例帶領入門,涵蓋 DOMDocument 載入、XPath 查詢、SimpleXML 物件存取、屬性處理、三種載入來源,並示範 XPath 與 SimpleXML 混合使用技巧。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book house="qinghuachubanshe">
<code>sb001</code>
<price>200</price>
<author>xiaoming</author>
<title>tianlongbabu</title>
</book>
<book house="beidachubanshe">
<code>sb002</code>
<price>400</price>
<author>daming</author>
<title>xiaoaojianghu</title>
</book>
</books>
<?php
// 1. 建立 DOMDocument
$dom = new DOMDocument('1.0', 'UTF-8');
// 2. 載入 XML 檔案
$dom->load('simplexml.xml');
// 3. 建立 DOMXPath
$xpath = new DOMXPath($dom);
// 4. 查詢:所有 title 節點
$nodeList = $xpath->query('/books/book/title');
echo "一共有 {$nodeList->length} 個<br/>";
for ($i = 0; $i < $nodeList->length; $i++) {
$node = $nodeList->item($i);
echo $node->nodeName . ':' . $node->nodeValue . "<br/>";
}
// 輸出:
// 一共有 2 個
// title:tianlongbabu
// title:xiaoaojianghu
?>
| 表達式 | 選取內容 |
|---|---|
/books/book | 根節點下的 book 子節點 |
//book | 文件中所有 book 節點(任意深度) |
//book[@house='qinghuachubanshe'] | 屬性 house 等於指定值的 book |
//book/title/text() | 所有 book 下 title 的文字內容 |
//book[price > 300] | price 內容大於 300 的 book(XPath 1.0 需轉邏輯) |
<?php
// 1. 直接載入檔案
$lib = simplexml_load_file('simplexml.xml');
// 2. DOMDocument 載入後轉換
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->load('simplexml.xml');
$lib = simplexml_import_dom($dom);
// 3. 從字串載入(Heredoc 語法)
$string = <<
<?php
$lib = simplexml_load_file('simplexml.xml');
$books = $lib->book; // 取得所有 book 節點陣列
for ($i = 0; $i < count($books); $i++) {
$book = $books[$i];
// 取得屬性:陣列語法
echo "屬性:{$book['house']}<br/>";
// 取得子節點:物件屬性
echo "第 $i 本書:{$book->title} || {$book->author}<br/>";
}
// 輸出:
// 屬性:qinghuachubanshe
// 第 0 本書:tianlongbabu || xiaoming
// 屬性:beidachubanshe
// 第 1 本書:xiaoaojianghu || daming
?>
SimpleXML 內建 xpath() 方法,回傳 SimpleXMLElement 陣列,極度方便。
<?php
$lib = simplexml_load_file('simplexml.xml');
// 取出所有書名
$titles = $lib->xpath('//title');
foreach ($titles as $key => $val) {
echo "$key || $val<br/>";
}
// 輸出:
// 0 || tianlongbabu
// 1 || xiaoaojianghu
?>
$xml->registerXPathNamespace('ns', 'https://uri') 後用 //ns:tag。$xml->book[0]->title = '新書名'; 直接賦值,再 $xml->asXML() 輸出。file_put_contents('new.xml', $xml->asXML());simplexml_load_file 回傳 false?libxml_use_internal_errors(true),迴圈 libxml_get_errors() 印出詳細錯誤(編碼、格式、實體未定義等)。$node['attr'],而非 $node->attr(後者取同名子節點)。//* 先測試能否取得任意節點。XPath 提供宣告式、跨層級的強大查詢能力;SimpleXML 以物件導向直覺操作 XML 結構。兩者結合(SimpleXML::xpath)兼具易用與強大。建議:讀取/查詢用 SimpleXML,複雜建立/命名空間用 DOMDocument,大檔案用 XMLReader。