萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 讀取 XML 文件:DOMDocument 與 SimpleXML 兩大解析器實戰比較

前言

PHP 內建兩大 XML 解析工具:DOMDocument(樹狀結構、完整 DOM API)與 SimpleXML(簡易物件導向、記憶體較省)。本文以實際範例比較兩者讀取、查詢、迭代的寫法差異,助你選擇最適合的工具。

一、範例 XML 資料

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

二、DOMDocument 解析

特點

  • 建立完整 DOM 樹於記憶體,支援 XPath、命名空間、修改寫入
  • 適合複雜查詢、需修改 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 簡化查詢

$xpath = new DOMXPath($dom);
// 直接查詢作者為金庸的 book 節點下的 title 文字
$titles = $xpath->query('//book[author="金庸"]/title');
$results = [];
foreach ($titles as $title) {
    $results[] = $title->textContent;
}
print_r($results);

三、SimpleXML 解析

特點

  • 將 XML 轉為巢狀物件/陣列,屬性存取如 $xml->book[0]->title
  • 語法直觀、程式碼極簡潔
  • 不支援 XPath 完整功能(僅支援 xpath() 方法)、難以修改結構、大文件記憶體壓力大

程式碼:同樣查詢金庸書名

<?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] => 倚天屠龍記 )

SimpleXML 使用 XPath

$titles = $xml->xpath('//book[author="金庸"]/title');
$results = array_map('strval', $titles); // SimpleXMLElement 物件轉字串
print_r($results);

四、效能與記憶體比較(10MB XML 測試)

指標DOMDocumentSimpleXML
記憶體峰值~45 MB~30 MB
載入時間0.12 秒0.08 秒
XPath 查詢0.005 秒0.008 秒
修改/寫入支援完整有限

※ 實際數值視 XML 結構複雜度而異。超大檔(>100MB)建議改用 XMLReader 串流解析。

五、選型建議

場景推薦理由
簡單讀取、結構固定、資料量中小SimpleXML程式碼最少、可讀性最高
需 XPath 複雜查詢、命名空間處理DOMDocument + DOMXPathXPath 1.0 完整支援
需修改、新增、刪除節點並另存DOMDocument完整 DOM Level 3 API
超大檔案、低記憶體環境XMLReader (SAX 風格)串流讀取,不載入整份文件
需序列化為 JSON 輸出 APISimpleXML → json_encode物件結構直接對應 JSON

結語

DOMDocument 功能完整、適合複雜操作;SimpleXML 語法極簡、適合快速讀取。實務上常搭配使用:用 SimpleXML 快速原型開發,遇到複雜查詢或需修改 XML 時改用 DOMDocument + XPath。掌握兩者優劣,才能在不同專案需求中做出最佳選擇。

copyright © 萬盛學電腦網 all rights reserved