在PHP 中,解析XML 數據的方式有很多種,比如使用DOM、SimpleXML 或XML Parser。本文將介紹如何使用底層的xml_parse()函數結合XML 解析器來處理。
xml_parse()是PHP 的XML 擴展函數之一,用於將XML 字符串送入解析器進行解析。它結合xml_parser_create() 、 xml_set_element_handler()等函數使用,適合處理需要對標籤結構進行精細控制的場景。
假設你有一個動態生成XML 的接口:
https://api.m66.net/data/feed.xml
你希望從這個地址獲取XML 數據,並解析出<item>標籤下的title和link字段。
<?php
// 初始化解析器
$parser = xml_parser_create();
// 存儲數據的數組
$parsedData = [];
$currentTag = '';
$currentItem = [];
// 定義開始標籤處理器
function startElement($parser, $name, $attrs) {
global $currentTag, $currentItem;
$currentTag = strtolower($name);
if ($currentTag === 'item') {
$currentItem = [];
}
}
// 定義結束標籤處理器
function endElement($parser, $name) {
global $currentTag, $currentItem, $parsedData;
if (strtolower($name) === 'item') {
$parsedData[] = $currentItem;
}
$currentTag = '';
}
// 定義字符數據處理器
function characterData($parser, $data) {
global $currentTag, $currentItem;
$data = trim($data);
if (!$data) return;
if ($currentTag === 'title') {
$currentItem['title'] = (isset($currentItem['title']) ? $currentItem['title'] : '') . $data;
} elseif ($currentTag === 'link') {
$currentItem['link'] = (isset($currentItem['link']) ? $currentItem['link'] : '') . $data;
}
}
// 設置處理器
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 從遠程獲取 XML 內容
$url = "https://api.m66.net/data/feed.xml";
$xmlData = file_get_contents($url);
if (!$xmlData) {
die("無法獲取 XML 數據");
}
// 開始解析
if (!xml_parse($parser, $xmlData, true)) {
die(sprintf("XML 錯誤: %s 在第 %d 行",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
// 釋放解析器資源
xml_parser_free($parser);
// 輸出結果
echo "<pre>";
print_r($parsedData);
echo "</pre>";
?>
Array
(
[0] => Array
(
[title] => 示例標題1
[link] => https://www.m66.net/item/123
)
[1] => Array
(
[title] => 示例標題2
[link] => https://www.m66.net/item/456
)
)
使用xml_parse()提供了對XML 數據結構的完整控制,適用於復雜或非標準結構的XML 文件。雖然使用起來不如SimpleXML 簡潔,但對於需要自定義處理流程的場景,它非常有用。