在 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 简洁,但对于需要自定义处理流程的场景,它非常有用。
相关标签:
xml_parse