首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP SAX 解析 XML 元素結構:xml_parser 事件驅動完整實作

     編輯:PHP 相關知識

SAX 解析核心邏輯

SAX(Simple API for XML)採用事件驅動:解析器逐行讀取 XML,遇到開始標籤、結束標籤、文字資料時觸發對應回調函數。開發者需在回調中維護狀態(如當前深度、父節點路徑)以重建結構。

完整代碼實作:樹狀結構輸出

<?php
$file = "data.xml";
$depth = [];

// 開始標籤回調
function startElement($parser, $name, $attrs) {
    global $depth;
    // 依深度縮排
    for ($i = 0; $i < $depth[$parser]; $i++) {
        print "  ";
    }
    print "$name\n";
    $depth[$parser]++;
}

// 結束標籤回調
function endElement($parser, $name) {
    global $depth;
    $depth[$parser]--;
}

// 1. 建立解析器
$xml_parser = xml_parser_create();

// 2. 註冊元素處理器
xml_set_element_handler($xml_parser, "startElement", "endElement");

// 3. 開啟檔案逐塊解析
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf(
            "XML error: %s at line %d",
            xml_error_string(xml_get_error_code($xml_parser)),
            xml_get_current_line_number($xml_parser)
        ));
    }
}

// 4. 釋放資源
xml_parser_free($xml_parser);
?>

關鍵 API 說明

函數用途
xml_parser_create()建立解析器資源
xml_set_element_handler()設定開始/結束標籤回調
xml_set_character_data_handler()設定文字資料回調(可選)
xml_parse()解析資料塊,第三參數標示是否為最後一塊
xml_get_error_code()取得錯誤代碼
xml_error_string()錯誤代碼轉人類可讀訊息
xml_get_current_line_number()取得錯誤發生行號
xml_parser_free()釋放解析器記憶體

狀態管理模式

  • 用全域陣列 $depth[$parser] 追蹤巢狀深度;
  • 複雜結構可建立堆疊陣列記錄節點路徑、屬性、父子關係;
  • 回調函數間共享狀態可用 global、靜態變數或物件屬性(PHP 5+ 建議封裝為類)。

適用場景與限制

適用: 大型 XML(>100MB)、串流處理、記憶體嚴格受限、僅需單次順序讀取。
不適合: 需隨機存取、修改 XML 結構、複雜 XPath 查詢、多次遍歷——請改用 DOMDocument 或 XMLReader。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved