當前位置: 首頁> 最新文章列表> 結合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等更高級的解析器。