現在の位置: ホーム> 最新記事一覧> XML_PARSEとCURLを組み合わせてXMLデータをダウンロードして解析する

XML_PARSEとCURLを組み合わせてXMLデータをダウンロードして解析する

M66 2025-05-13

毎日のPHP開発では、リモートサーバーからXMLデータを取得して解析する必要があることがよくあります。この記事では、 Curlを使用してXMLデータをダウンロードし、 XML_PARSEシリーズ関数と組み合わせてコンテンツを解析し、利用可能な配列構造に変換する方法を示します。

1。準備:必要な拡張機能を有効にします

まず、PHP環境で次の拡張機能が有効になっていることを確認してください。

  • Curl :データをリモートでダウンロードするために使用されます

  • XMLパーサー:XMLドキュメントを解析するために使用されます

これらの2つの拡張機能は、組み込まれており、追加のインストールを必要としないほとんどのPHPインストールパッケージにデフォルトです。

2. Curlを使用してXMLデータを取得します

まず、リモートアドレスからXMLコンテンツをCurlからダウンロードしましょう。

 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 失敗');
}

3. 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;
}

4。完了例:ダウンロードから分析まで

上記の2つの部分を組み合わせることにより、完全な「ダウンロード +解析」プロセスを実装できます。

 $url = 'https://api.m66.net/data/sample.xml';
$xmlContent = fetchXmlData($url);

if ($xmlContent) {
    $parsedData = parseXmlToArray($xmlContent);
    echo "<pre>";
    print_r($parsedData);
    echo "</pre>";
}

5。概要

この記事を通じて、PHPのCurl拡張機能を使用してXMLデータをダウンロードする方法と、 XML_PARSEを使用して構造化された配列に解析する方法を習得しました。 XML_PARSEは低レベルの方法ですが、パフォーマンスが高く、依存関係が少ないため、パフォーマンス要件を持つプロジェクトに適しています。

より複雑なXMLに対処する必要がある場合は、将来的にはSimplexMLDomDocumentなどのより高度なパーサーを使用しようとすることをお勧めします。