XML 雖不如 JSON 輕量,但在企業整合、金融報文、電子發票、SOAP API 等場景仍屬標準格式。PHP 內建三大 XML 處理擴展:SimpleXML(易用)、DOMDocument(功能完整)、XMLReader/Writer(串流/低記憶體)。本文以實戰範例帶您掌握核心操作。
<?xml version="1.0" encoding="UTF-8"?>
<departs>
<depart id="d1">
<name>研發部</name>
<employees>
<employee id="e1"><name>張三</name><role>工程師</role></employee>
<employee id="e2"><name>李四</name><role>主管</role></employee>
</employees>
</depart>
<depart id="d2">
<name>行銷部</name>
<employees>
<employee id="e3"><name>王五</name><role>專員</role></employee>
</employees>
</depart>
</departs>
$xml = simplexml_load_file('example.xml');
// 或從字串
$xml = simplexml_load_string($xmlString);
// 存取屬性
echo $xml->depart[0]['id']; // d1
// 存取子元素
echo $xml->depart[0]->name; // 研發部
// 遍歷所有部門名稱
foreach ($xml->depart as $dept) {
echo $dept->name . PHP_EOL;
}
// XPath 精準定位:取得所有員工姓名
$names = $xml->xpath('//employee/name');
foreach ($names as $name) {
echo (string)$name . PHP_EOL;
}
// 依條件篩選:id 為 e2 的員工
$emp = $xml->xpath('//employee[@id="e2"]')[0] ?? null;
// 修改節點內容
$xml->depart[0]->name = '研發中心';
// 新增節點
$newDept = $xml->addChild('depart', '');
$newDept->addAttribute('id', 'd3');
$newDept->addChild('name', '資安部');
// 輸出為字串或寫入檔案
$xml->asXML('updated.xml'); // 直接寫檔
echo $xml->asXML(); // 回傳字串
適合需求:大型 XML、需寫入 CDATA、處理命名空間、XSLT 轉換。
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // 美化縮排
$root = $dom->createElement('response');
$dom->appendChild($root);
$books = $dom->createElement('books');
$root->appendChild($books);
$book = $dom->createElement('book');
$books->appendChild($book);
$title = $dom->createElement('title', 'PHP 與 AJAX');
$book->appendChild($title);
$isbn = $dom->createElement('isbn', '1-21258986');
$book->appendChild($isbn);
echo $dom->saveXML();
// 或存檔
$dom->save('books.xml');
$dom = new DOMDocument();
$dom->load('example.xml');
$xpath = new DOMXPath($dom);
// 註冊命名空間(若 XML 有預設 ns)
// $xpath->registerNamespace('ns', 'https://example.com/ns');
$nodes = $xpath->query('//depart/name');
foreach ($nodes as $node) {
echo $node->textContent . PHP_EOL;
}
避免一次載入整份 XML 到記憶體,適合超過百 MB 的檔案。
$reader = new XMLReader();
$reader->open('large.xml');
while ($reader->read()) {
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'employee') {
// 展開當前節點為 SimpleXML 物件方便處理
$simple = simplexml_import_dom($reader->expand());
echo $simple->name . ' - ' . $simple->role . PHP_EOL;
}
}
$reader->close();
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('users');
foreach ($users as $u) {
$writer->startElement('user');
$writer->writeAttribute('id', $u['id']);
$writer->writeElement('name', $u['name']);
$writer->writeElement('email', $u['email']);
$writer->endElement(); // user
}
$writer->endElement(); // users
$writer->endDocument();
file_put_contents('users.xml', $writer->outputMemory());
| 擴展 | 適用場景 | 記憶體 | 學習曲線 |
|---|---|---|---|
| SimpleXML | 中小型 XML、快速開發、僅讀/少量寫入 | 整份載入 | 低 |
| DOMDocument | 複雜操作、命名空間、XSLT、需精確控制 | 整份載入 | 中 |
| XMLReader/Writer | 大型 XML(>50MB)、串流轉換、低記憶體限制 | 串流/極低 | 中高 |
PHP 的 XML 生態相當成熟,關鍵在於根據檔案大小、操作複雜度與效能需求選擇適當工具。日常開發以 SimpleXML 為主,大檔案改用 XMLReader,需求複雜時再引入 DOMDocument,即能兼顧開發效率與執行效能。