當前位置: 首頁> 最新文章列表> 如何使用xml_parse 函數解析包含CDATA 區域的XML 文檔?

如何使用xml_parse 函數解析包含CDATA 區域的XML 文檔?

M66 2025-05-13

在PHP 中處理XML 的方式有很多種,其中xml_parse是一個底層函數,適合對XML 結構有更強控制需求的開發者。本文將介紹如何使用xml_parse函數來解析一個包含CDATA區域的XML 文檔。

什麼是CDATA 區域?

在XML 中, <![CDATA[ ... ]]>是一種指令,用來告訴解析器其中的內容不應被作為XML 語法解析。這對包含特殊字符的內容非常有用,比如HTML 或腳本代碼。

示例:

 <note>
  <to>Tom</to>
  <message><![CDATA[Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!]]></message>
</note>

使用xml_parse 解析XML 的基本步驟

xml_parse是PHP 中用於逐行解析XML 的函數。要使用它解析CDATA 區域,通常需要配合xml_parser_create()和自定義的處理器函數。

1. 創建解析器

$parser = xml_parser_create();

2. 設置處理函數

你需要註冊三個處理器函數:開始標籤、結束標籤和字符數據處理器。

 $data = [];

function startElement($parser, $name, $attrs) {
    global $data;
    $data['current'] = $name;
}

function endElement($parser, $name) {
    global $data;
    $data['current'] = null;
}

function characterData($parser, $value) {
    global $data;
    if (!isset($data['values'][$data['current']])) {
        $data['values'][$data['current']] = '';
    }
    $data['values'][$data['current']] .= $value;
}

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

3. 解析XML 數據

$xml = <<<XML
<note>
  <to>Tom</to>
  <message><![CDATA[Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!]]></message>
</note>
XML;

if (!xml_parse($parser, $xml, true)) {
    die(sprintf("XML Error: %s at line %d",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
}
xml_parser_free($parser);

4. 輸出結果

print_r($data['values']);

輸出將是:

 Array
(
    [TO] => Tom
    [MESSAGE] => Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!
)

注意:所有標籤名會被轉為大寫。

小結

xml_parse是一種事件驅動的XML 解析方式,適合處理複雜或大體積的XML 數據。對於包含CDATA 的情況,只需要設置好characterData處理器即可正常捕獲其內容。儘管使用起來比DOM 或SimpleXML 更複雜,但它在性能和靈活性上有一定優勢。

如果你的項目對解析效率要求較高,或者需要自定義處理XML 中的事件,那麼xml_parse將會是一個不錯的選擇。