PHP 提供三種主流 XML 解析方式,各適應不同場景。以標準 books.xml 為例:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
...
</bookstore>
<?php
$doc = new DOMDocument();
$doc->load('books.xml');
$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
$title = $book->getElementsByTagName('title')->item(0)->nodeValue;
$author = $book->getElementsByTagName('author')->item(0)->nodeValue;
$year = $book->getElementsByTagName('year')->item(0)->nodeValue;
$price = $book->getElementsByTagName('price')->item(0)->nodeValue;
echo "title:$title<br>author:$author<br>year:$year<br>price:$price<br>";
}
<?php
$parser = xml_parser_create();
xml_parse_into_struct($parser, file_get_contents('books.xml'), $vals, $index);
xml_parser_free($parser);
// $vals 為結構化陣列,需自行遍歷組裝
foreach ($vals as $v) {
if ($v['type'] === 'complete' && $v['tag'] === 'TITLE') {
echo $v['value'] . "<br>";
}
}
<?php
$xml = simplexml_load_file('books.xml');
foreach ($xml->book as $book) {
echo "title:{$book->title}<br>";
echo "author:{$book->author}<br>";
echo "year:{$book->year}<br>";
echo "price:{$book->price}<br>";
// 屬性存取
echo "category:{$book['category']}<br>";
}
| 場景 | 推薦 | 理由 |
|---|---|---|
| 小/中型 XML(<10MB)、需修改/寫入 | DOMDocument | 功能完整、XPath 強大 |
| 小/中型 XML、唯讀、追求開發速度 | SimpleXML | 語法最簡、物件直觀 |
| 大型 XML(>50MB)、記憶體受限、串流處理 | XMLReader / SAX | 逐節點讀取、常數記憶體 |
| 需命名空間、複雜 XPath、XSLT 轉換 | DOMDocument | 標準相容度最高 |
根據專案資料規模與功能需求,選擇最適合的解析器,兼顧開發效率與執行效能。