在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。