当前位置: 首页> 最新文章列表> 结合 xml_parse 与 curl 下载并解析 XML 数据

结合 xml_parse 与 curl 下载并解析 XML 数据

M66 2025-05-13

在日常的 PHP 开发中,我们经常需要从远程服务器获取 XML 数据,并对其进行解析。本文将演示如何使用 curl 下载 XML 数据,然后结合 xml_parse 系列函数解析内容,并转为可用的数组结构。

一、准备工作:启用所需扩展

首先,请确保你的 PHP 环境中启用了以下扩展:

  • cURL:用于远程下载数据

  • XML Parser:用于解析 XML 文档

这两个扩展默认大多数 PHP 安装包已经内置,无需额外安装。

二、使用 curl 获取 XML 数据

我们先通过 cURL 从一个远程地址下载 XML 内容:

function fetchXmlData($url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $data = curl_exec($ch);

    if (curl_errno($ch)) {
        echo 'Curl error: ' . curl_error($ch);
        return false;
    }

    curl_close($ch);
    return $data;
}

// 示例 URL
$url = 'https://api.m66.net/data/sample.xml';
$xmlContent = fetchXmlData($url);

if ($xmlContent === false) {
    exit('获取 XML 失败');
}

三、使用 xml_parse 解析 XML 数据

PHP 的 xml_parse 函数是基于事件驱动的 XML 解析方式。我们可以通过创建解析器并设置处理函数来将 XML 内容转为结构化数组。

function parseXmlToArray($xml) {
    $parser = xml_parser_create();
    $values = [];
    $index = [];

    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

    if (!xml_parse_into_struct($parser, $xml, $values, $index)) {
        echo "XML 解析错误: " . xml_error_string(xml_get_error_code($parser));
        xml_parser_free($parser);
        return false;
    }

    xml_parser_free($parser);
    return buildXmlArray($values);
}

function buildXmlArray($values) {
    $result = [];
    $stack = [];

    foreach ($values as $val) {
        switch ($val['type']) {
            case 'open':
                $tag = $val['tag'];
                $child = [];
                if (isset($val['attributes'])) {
                    $child['@attributes'] = $val['attributes'];
                }
                $child['@children'] = [];
                $stack[] = [&$result];
                $result[$tag][] = &$child;
                $result = &$child['@children'];
                break;

            case 'complete':
                $tag = $val['tag'];
                $entry = isset($val['value']) ? $val['value'] : '';
                if (isset($val['attributes'])) {
                    $result[$tag][] = [
                        '@attributes' => $val['attributes'],
                        '@value' => $entry
                    ];
                } else {
                    $result[$tag][] = $entry;
                }
                break;

            case 'close':
                $result = &$stack[count($stack) - 1][0];
                array_pop($stack);
                break;
        }
    }

    return $result;
}

四、完整示例:从下载到解析

将上面两部分结合起来,我们就可以实现完整的“下载 + 解析”过程:

$url = 'https://api.m66.net/data/sample.xml';
$xmlContent = fetchXmlData($url);

if ($xmlContent) {
    $parsedData = parseXmlToArray($xmlContent);
    echo "<pre>";
    print_r($parsedData);
    echo "</pre>";
}

五、小结

通过本文的学习,你已经掌握了如何使用 PHP 的 cURL 扩展下载 XML 数据,以及如何利用 xml_parse 解析它为结构化的数组。虽然 xml_parse 是一种较底层的方式,但它性能高、依赖少,适合对性能有要求的项目。

如果你需要处理更复杂的 XML,建议后续也可尝试使用 SimpleXMLDOMDocument 等更高级的解析器。