当前位置: 首页> 最新文章列表> 如何使用 xml_parse 函数解析动态生成的 XML 数据?

如何使用 xml_parse 函数解析动态生成的 XML 数据?

M66 2025-05-11

在 PHP 中,解析 XML 数据的方式有很多种,比如使用 DOM、SimpleXML 或 XML Parser。本文将介绍如何使用底层的 xml_parse() 函数结合 XML 解析器来处理。

什么是 xml_parse()

xml_parse() 是 PHP 的 XML 扩展函数之一,用于将 XML 字符串送入解析器进行解析。它结合 xml_parser_create()xml_set_element_handler() 等函数使用,适合处理需要对标签结构进行精细控制的场景。

示例场景:从远程地址获取 XML 数据

假设你有一个动态生成 XML 的接口:

https://api.m66.net/data/feed.xml

你希望从这个地址获取 XML 数据,并解析出 <item> 标签下的 titlelink 字段。

示例代码

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