PHP 提供三種互補的 XML 處理模型:DOM 樹狀模型(隨機存取、修改)、XMLReader 流式拉取模型(低記憶體、單向讀取)、XMLWriter 流式推送模型(高效生成)。本文系統整理三者核心 API、適用場景、效能特性與實戰範例。
| 維度 | DOM (DOMDocument) | XMLReader | XMLWriter |
|---|---|---|---|
| 模型類型 | 樹狀 (DOM Level 3) | 游標/拉取 (StAX 風格) | 流式/推送 |
| 記憶體佔用 | O(N) 載入整份文檔 | O(1) 僅當前節點 | O(1) 緩衝區輸出 |
| 操作方向 | 隨機讀寫、修改、序列化 | 單向前進讀取 | 單向順序寫入 |
| 適用場景 | 小/中型文檔、需修改/查詢、XPath | 大型文檔(>100MB)、串流處理、SAX 遷移 | 生成大型 XML、API 回應、匯出報表 |
| 命名空間支援 | 完整 | 完整 | 完整 |
| 驗證 (DTD/Schema) | schemaValidate / validate | isValid / setSchema | 無 (僅生成) |
| 學習曲線 | 中等 | 較高 (狀態機思維) | 低 |
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
// 載入檔案
$dom->load('config.xml'); // 檔案路徑
$dom->loadXML($xmlString); // 字串 (需 XML 宣告)
$dom->loadHTML($htmlString); // 寬容 HTML5 (libxml_use_internal_errors)
// 儲存
$dom->save('output.xml'); // 寫入檔案,返回位元組數
$xmlStr = $dom->saveXML(); // 序列化整份文檔
$xmlStr = $dom->saveXML($node); // 序列化特定節點
$dom->formatOutput = true; // 美化縮排 (輸出時)
$dom->preserveWhiteSpace = false; // 載入時移除無意義空白
?>
<?php
// 建立元素節點
$elem = $dom->createElement('book', 'PHP 精進'); // 含文字內容
$elem = $dom->createElement('book'); // 空元素
$elem->textContent = 'PHP 精進'; // 設定文字 (自動實體化)
// 建立屬性
$attr = $dom->createAttribute('isbn');
$attr->value = '978-7-115-12345-6';
$elem->appendChild($attr);
// 或捷徑
$elem->setAttribute('isbn', '978-7-115-12345-6');
$elem->setAttributeNS('https://ns.example.com', 'ex:price', '299');
// 建立文字/CDATA/註釋/處理指令
$text = $dom->createTextNode('含 < 特殊字元 >'); // 自動跳脫
$cdata = $dom->createCDATASection('原始