當前位置: 首頁> 最新文章列表> 如何將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。