準備工作:範例 XML 檔案
<?xml version="1.0" encoding="utf-8"?>
<data>
<category id="1">
<item>Item A</item>
<item>Item B</item>
</category>
<category id="2">
<item>Item C</item>
</category>
<meta>
<author>John</author>
<date>2024-01-15</date>
</meta>
</data>
方法一:DOMDocument(標準、功能完整)
基本讀取所有 <item>
<?php
$xml = new DOMDocument();
$xml->load('data.xml');
$items = $xml->getElementsByTagName('item');
foreach ($items as $item) {
echo $item->nodeValue . "<br>";
}
// 輸出:Item A, Item B, Item C
階層式讀取:依 category 分組
$categories = $xml->getElementsByTagName('category');
foreach ($categories as $cat) {
echo "Category ID: " . $cat->getAttribute('id') . "<br>";
$items = $cat->getElementsByTagName('item');
foreach ($items as $item) {
echo " - " . $item->nodeValue . "<br>";
}
}
讀取屬性與巢狀結構
$meta = $xml->getElementsByTagName('meta')->item(0);
$author = $meta->getElementsByTagName('author')->item(0)->nodeValue;
$date = $meta->getElementsByTagName('date')->item(0)->nodeValue;
echo "Author: $author, Date: $date";
方法二:SimpleXML(語法簡潔、適合單純讀取)
<?php
$xml = simplexml_load_file('data.xml');
// 直接以物件屬性存取
foreach ($xml->category as $cat) {
echo "Category ID: " . $cat['id'] . "<br>";
foreach ($cat->item as $item) {
echo " - " . (string)$item . "<br>";
}
}
echo "Author: " . (string)$xml->meta->author . "<br>";
echo "Date: " . (string)$xml->meta->date . "<br>";
進階技巧:XPath 查詢(DOMDocument 專屬)
$xpath = new DOMXPath($xml);
// 找出 id=2 的 category 下所有 item
$items = $xpath->query('//category[@id="2"]/item');
foreach ($items as $item) { echo $item->nodeValue; }
// 找出所有包含 "B" 的 item
$items = $xpath->query('//item[contains(text(), "B")]');
編碼處理關鍵點
- XML 宣告
encoding="utf-8" 需與實際檔案編碼一致
- PHP 內部處理為 UTF-8,輸出時注意
header('Content-Type: text/html; charset=utf-8')
- 若 XML 為 Big5/GBK,載入前先
iconv 轉碼或用 DOMDocument::loadHTML() 配合 mb_convert_encoding
錯誤處理與效能
libxml_use_internal_errors(true);
$xml = new DOMDocument();
if (!$xml->load('data.xml')) {
$errors = libxml_get_errors();
foreach ($errors as $e) { error_log($e->message); }
libxml_clear_errors();
die('XML 載入失敗');
}
// 大檔案建議用 XMLReader (SAX 模式) 串流讀取,避免記憶體爆增
選擇建議
| 場景 | 推薦 | 理由 |
| 簡單結構、單純讀取 | SimpleXML | 程式碼最少、可讀性最高 |
| 需 XPath、修改 XML、命名空間 | DOMDocument | 功能完整、W3C 標準 |
| 超大檔案 (>50MB) | XMLReader | 串流式、低記憶體 |
| 需寫入/產生 XML | DOMDocument | 支援 createElement/appendChild 等 |