兩大解析流派:SAX(事件驅動)與 DOM(樹狀模型)
- SAX (XML Parser): 逐行讀取,觸發事件回調(startElement, endElement, characterData),記憶體效率高、速度快,但邏輯分散,需自行維護狀態,處理複雜結構時程式碼冗長;
- DOM (DOMDocument / DOM XML / SimpleXML): 一次性載入整份 XML 至記憶體建立樹狀結構,操作直觀、支援隨機存取與修改,但記憶體佔用大,不適合超大檔案。
PHP 內建 XML 函數庫分類
| 函數庫 | 底層實現 | 風格 | 適用場景 |
| XML Parser (xml_parser_*) | expat (SAX) | 事件回調 | 大型 XML、串流處理、記憶體受限 |
| DOM / DOM XML / SimpleXML | libxml2 (DOM) | 樹狀物件 | 中小型 XML、需修改結構、XPath 查詢 |
| XSLT / XPath | libxslt / libxml2 | 轉換 / 查詢 | XML 轉 HTML、複雜條件查詢 |
各庫特點速覽
XML Parser (SAX)
- 需自訂三個回調函數:
xml_set_element_handler、xml_set_character_data_handler、xml_set_processing_instruction_handler;
- 邏輯集中在回調內,狀態靠全域變數或物件屬性傳遞;
- 處理不同 XML 結構需重寫回調邏輯,維護成本高。
DOM 系列
- DOMDocument: 標準 DOM Level 3 實現,功能最完整,支援 XPath、Schema 驗證、XInclude;
- SimpleXML: PHP 5+ 內建,語法極簡(
$xml->post[0]->title),適合單純讀取,不支援複雜修改與命名空間處理;
- DOM XML (PHP 4 遺產): 已棄用,勿用於新專案。
選型決策樹
- XML > 50MB 或記憶體受限 → XML Parser (SAX) 或 XMLReader(PHP 5.1+,pull 模式,介於 SAX/DOM 之間);
- 需修改 XML 結構、支援 XPath、Schema 驗證 → DOMDocument;
- 單純讀取、結構固定、追求開發速度 → SimpleXML;
- 需 XML 轉 HTML 或複雜查詢 → XSLT / XPath。
實務建議
現代 PHP 專案多採「SimpleXML 為主,DOMDocument 為輔」策略:簡單讀取用 SimpleXML,複雜操作轉 dom_import_simplexml() 接入 DOM 功能。避免直接使用底層 SAX 回調,除非極端效能敏感場景。