在 PHP 开发中,处理 XML 数据是常见的需求,尤其是在对接老旧系统或读取某些 API 时。尽管现在 JSON 更为流行,但仍有不少数据以 XML 形式提供。为了方便前端处理或进行后续处理,我们常常需要将 XML 转换为 JSON 格式。
在本文中,我们将使用 PHP 的 xml_parse 函数将 XML 字符串解析成数组结构,然后通过 json_encode 将其转换为 JSON 格式。
我们首先准备一段示例 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_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 就非常简单了,只需使用 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"
}
]
}
虽然 xml_parse 提供了底层控制,但在处理复杂 XML 时显得繁琐。可以考虑使用 PHP 的 SimpleXML:
$xml = simplexml_load_string($xml_data);
$json = json_encode($xml, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
这种方式更简单,也更适用于结构清晰的 XML。