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

PHP XML 程式設計入門:XPath 查詢與 SimpleXML 物件操作完整教學

     編輯:PHP 相關知識

前言

XML 在系統整合、配置管理、資料交換仍佔一席之地。PHP 提供兩大主流工具:XPath(路徑查詢語言)與 SimpleXML(物件導向封裝)。本文以實戰範例帶領入門,涵蓋 DOMDocument 載入、XPath 查詢、SimpleXML 物件存取、屬性處理、三種載入來源,並示範 XPath 與 SimpleXML 混合使用技巧。

範例 XML 資料

<?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>

方法一:DOMDocument + DOMXPath(標準 W3C)

<?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
?>

XPath 常用語法速查

表達式選取內容
/books/book根節點下的 book 子節點
//book文件中所有 book 節點(任意深度)
//book[@house='qinghuachubanshe']屬性 house 等於指定值的 book
//book/title/text()所有 book 下 title 的文字內容
//book[price > 300]price 內容大於 300 的 book(XPath 1.0 需轉邏輯)

方法二:SimpleXML 物件導向操作

三種載入方式

<?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 混合使用

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
?>

進階技巧與最佳實踐

  1. 命名空間處理:$xml->registerXPathNamespace('ns', 'https://uri') 後用 //ns:tag。
  2. 修改 XML 內容:$xml->book[0]->title = '新書名'; 直接賦值,再 $xml->asXML() 輸出。
  3. 儲存到檔案:file_put_contents('new.xml', $xml->asXML());
  4. 編碼一致性:XML 宣告、PHP 檔案、資料庫、HTTP Header 全統一 UTF-8。
  5. 大檔案改用 XMLReader:超過 10MB 建議串流式解析,避免記憶體耗盡。

常見錯誤排查

Q: simplexml_load_file 回傳 false?
A: 開啟 libxml_use_internal_errors(true),迴圈 libxml_get_errors() 印出詳細錯誤(編碼、格式、實體未定義等)。
Q: 屬性值取不到?
A: 使用陣列語法 $node['attr'],而非 $node->attr(後者取同名子節點)。
Q: XPath 查詢結果為空?
A: 確認路徑大小寫、命名空間、前綴是否正確;用 //* 先測試能否取得任意節點。

總結

XPath 提供宣告式、跨層級的強大查詢能力;SimpleXML 以物件導向直覺操作 XML 結構。兩者結合(SimpleXML::xpath)兼具易用與強大。建議:讀取/查詢用 SimpleXML,複雜建立/命名空間用 DOMDocument,大檔案用 XMLReader。

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