当前位置: 首页> 最新文章列表> 如何将 xml_parse 结果与 json_encode 转换为 JSON 格式

如何将 xml_parse 结果与 json_encode 转换为 JSON 格式

M66 2025-04-24

在 PHP 开发中,处理 XML 数据是常见的需求,尤其是在对接老旧系统或读取某些 API 时。尽管现在 JSON 更为流行,但仍有不少数据以 XML 形式提供。为了方便前端处理或进行后续处理,我们常常需要将 XML 转换为 JSON 格式。

在本文中,我们将使用 PHP 的 xml_parse 函数将 XML 字符串解析成数组结构,然后通过 json_encode 将其转换为 JSON 格式。

第一步:准备 XML 数据

我们首先准备一段示例 XML 数据,模拟从远程地址(例如 https://api.m66.net/data.xml)获取的响应:

$xml_data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <title>PHP 编程实战</title>
        <author>张三</author>
        <year>2021</year>
    </book>
    <book>
        <title>深入理解 XML</title>
        <author>李四</author>
        <year>2020</year>
    </book>
</books>
XML;

第二步:解析 XML 为数组

xml_parse 是低级别的 XML 解析函数,通常我们会结合 xml_parser_create 和回调函数来将 XML 内容转换成数组。以下是一个简单的解析函数,它将 XML 转为关联数组:

function xml_to_array($xml_string) {
    $parser = xml_parser_create();
    xml_parse_into_struct($parser, $xml_string, $values, $index);
    xml_parser_free($parser);

    $result = [];
    $stack = [];

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

            case 'complete':
                $tag = $val['tag'];
                $value = isset($val['value']) ? $val['value'] : '';
                if (!isset($result[$tag])) {
                    $result[$tag] = [];
                }
                $result[$tag][] = $value;
                break;

            case 'close':
                array_pop($stack);
                break;
        }
    }

    return $result;
}

注意:上面的代码是为了演示用法,未考虑所有可能的 XML 结构情况,建议生产环境使用更完整的解析器如 SimpleXML 或 DOMDocument。

第三步:使用 json_encode 转换为 JSON 格式

有了数组结构后,将其转换为 JSON 就非常简单了,只需使用 json_encode

$parsed_array = xml_to_array($xml_data);
$json_result = json_encode($parsed_array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

echo $json_result;

输出结果大致如下:

{
    "BOOK": [
        {
            "TITLE": "PHP 编程实战",
            "AUTHOR": "张三",
            "YEAR": "2021"
        },
        {
            "TITLE": "深入理解 XML",
            "AUTHOR": "李四",
            "YEAR": "2020"
        }
    ]
}

进阶建议:使用 SimpleXML 或 DOM 执行转换

虽然 xml_parse 提供了底层控制,但在处理复杂 XML 时显得繁琐。可以考虑使用 PHP 的 SimpleXML:

$xml = simplexml_load_string($xml_data);
$json = json_encode($xml, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;

这种方式更简单,也更适用于结构清晰的 XML。