0

解析してデータベースにインポートする大きな XML ファイル (4 GB) があります。私は XMLReader で遊んでいますが、動作させることができないようで、PHP ドキュメントには動作する例があまりありません。

私の目標は、作業中の XML ファイルの次の (簡略化された) バージョンから "url" と "text" の組み合わせを抽出することです。

<everything>
   <doc>
      <field1>...</field2>
      <url>www.theurlthatIwant.com</url>
      <text>This is some text which I want to extract with the url</text>
      <random>
         <subrandom> </subrandom>
         <subrandom> </subrandom>
         <subrandom> </subrandom>
      </random>
   </doc>
   <doc>
      <field1>...</field2>
      <url>www.anotherurl.com</url>
      <text>This is some more text which I want to extract with the url</text>
      <random>
         <subrandom> ... </subrandom>
         <subrandom> ...  </subrandom>
         <subrandom> ... </subrandom>
      </random>
   </doc>
   ...
</everything>

XMLReader を使用して「url」と「text」を取得し、残りを無視するための疑似コードは何ですか? さらに (はるかに簡単に) 処理できるように、ペアを CSV ファイルに出力する予定です。ありがとうございました!

更新しました:

それを理解して、将来の読者のために以下の回答を投稿してください。

4

1 に答える 1

0

私はついにそれを働かせました。私が理解できなかったのは、read() が次の要素に移動するだけでなく、次の TOKEN (テキスト、終了タグ、または任意の XML 要素) に移動することです。将来の読者のための作業コードは次のとおりです。

$xml = new XMLReader;
$xml->open('data.xml');

$xml->read(); // One read to skip the "everything" element

while ($xml->read()) {
        if ($xml->nodeType == XMLReader::ELEMENT) {
                if ($xml->name == 'url') {
                    $xml->read();
                    if ($xml->nodeType == XMLReader::TEXT) {
                       print 'got url: ' . $xml->value.PHP_EOL;
                    }
                }elseif ($xml->name == 'text') {
                    $xml->read();
                    if ($xml->nodeType == XMLReader::TEXT) {
                       print 'got text: ' . $xml->value.PHP_EOL;
                    }
                }
        }     
}
于 2013-07-30T03:28:54.693 に答える