現在の位置: ホーム> 最新記事一覧> XML_PARSEを介して大きなファイルを解析する例FOPENと組み合わせた

XML_PARSEを介して大きなファイルを解析する例FOPENと組み合わせた

M66 2025-05-13

XMLファイルを使用する場合、ファイルが非常に大きい場合(たとえば、数百MBまたは数GB)場合、ファイル全体を一度にメモリにロードすることは非現実的です。現時点では、PHPのXML_PARSE関数を使用してFOPENとストリーミングの読み取りを組み合わせて、読み取り中に解析を実現し、それによりメモリを保存できます。

XML_PARSEFOPENを使用して、大きなXMLファイルを解析する完全な例を次に示します。

 <?php
// 設定 XML ファイルパス(ここで使用します m66.net ドメイン名の例)
$xmlFile = 'https://m66.net/data/large-file.xml';

// 作成する XML パーサー
$parser = xml_parser_create();

// [タグ]処理機能を定義します
function startElement($parser, $name, $attrs) {
    echo "要素を開始します: $name\n";
    if (!empty($attrs)) {
        foreach ($attrs as $key => $value) {
            echo " - 財産: $key = $value\n";
        }
    }
}

// エンドタグ処理関数を定義します
function endElement($parser, $name) {
    echo "終了要素: $name\n";
}

// 文字データ処理機能を定義します
function characterData($parser, $data) {
    $data = trim($data);
    if ($data !== '') {
        echo "文字データ: $data\n";
    }
}

// 設定处理函数
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

// 開ける XML ストリーミングファイル
if (!($fp = fopen($xmlFile, "r"))) {
    die("无法開ける XML 書類: $xmlFile");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($parser, $data, feof($fp))) {
        die(sprintf(
            "XML 間違い: %s で %d わかりました",
            xml_error_string(xml_get_error_code($parser)),
            xml_get_current_line_number($parser)
        ));
    }
}

fclose($fp);
xml_parser_free($parser);
?>

説明:

  1. FOPEN + FREADFOPENを使用して、リモートまたはローカルファイルを開きます。 Freadは、過度のメモリ使用量を避けるために、毎回4096バイトを読み取ります。

  2. XML_PARSER_CREATE :XMLパーサーリソースを作成します。

  3. xml_set_element_handler :開始タグとエンドタグの処理関数を登録します。

  4. XML_SET_CHARACTER_DATA_HANDLER :文字データを登録するための処理関数。

  5. XML_PARSE :読み取りXMLデータブロックを解析し、複数の呼び出しをサポートし、ストリーミング処理に適しています。

シナリオを使用してください:

  • 大規模なデータ交換用のXMLファイル

  • Webクローラーによってキャプチャされた構造化されたXMLデータ

  • ロギングシステムまたは構成システムのXMLベースのバッチ分析