在PHP 中處理XML 的方式有很多種,其中xml_parse是一個底層函數,適合對XML 結構有更強控制需求的開發者。本文將介紹如何使用xml_parse函數來解析一個包含CDATA區域的XML 文檔。
在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是PHP 中用於逐行解析XML 的函數。要使用它解析CDATA 區域,通常需要配合xml_parser_create()和自定義的處理器函數。
$parser = xml_parser_create();
你需要註冊三個處理器函數:開始標籤、結束標籤和字符數據處理器。
$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");
$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);
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將會是一個不錯的選擇。
相關標籤:
xml_parse