1. ホーム
  2. php

[解決済み] PHPでXMLReaderを使うには?

2023-05-11 13:22:05

質問

私は以下のXMLファイルを持っています。ファイルはかなり大きく、私はファイルを開いて読むためにsimplexmlを得ることができなかったので、私はphpで成功しなかったXMLReaderを試しています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
    <last_updated>2009-11-30 13:52:40</last_updated>
    <product>
        <element_1>foo</element_1>
        <element_2>foo</element_2>
        <element_3>foo</element_3>
        <element_4>foo</element_4>
    </product>
    <product>
        <element_1>bar</element_1>
        <element_2>bar</element_2>
        <element_3>bar</element_3>
        <element_4>bar</element_4>
    </product>
</products>

私は残念ながら、PHPのためのこれに関する良いチュートリアルを見つけていません。

どのように解決するのですか?

仕事の単位がどの程度かにもよりますが、それぞれの <product/> のノードが連続している。

そのためには、XMLReader を使用して各ノードにアクセスし、SimpleXML を使用してそれらにアクセスするのが最も簡単な方法でしょう。この方法では、一度に一つのノードを扱うため、メモリ使用量を低く抑えることができ、SimpleXMLの使いやすさを利用することができます。例えば

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

$doc = new DOMDocument;

// move to the first <product /> node
while ($z->read() && $z->name !== 'product');

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'product')
{
    // either one should work
    //$node = new SimpleXMLElement($z->readOuterXML());
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    // now you can use $node without going insane about parsing
    var_dump($node->element_1);

    // go to next <product />
    $z->next('product');
}

さまざまなアプローチの長所と短所の簡単な概要。

XMLReader のみ

  • 長所:高速、メモリ使用量が少ない

  • 短所: 書くのもデバッグするのも非常に困難で、有用なことをするためには多くのユーザーランドコードを必要とする。ユーザーランドのコードは遅く、エラーが発生しやすい。さらに、メンテナンスのためにより多くのコード行を残すことになります。

XMLReader + SimpleXML

  • 長所: メモリをあまり使用せず(1つのノードを処理するのに必要なメモリのみ)、SimpleXMLはその名の通り、本当に簡単に使用できます。

  • 短所: 各ノードに対して SimpleXMLElement オブジェクトを作成することはあまり速くありません。それが自分にとって問題なのかどうかを理解するには、本当にベンチマークをする必要があります。控えめなマシンであっても、1秒間に1000ノードを処理することができるでしょうが。

XMLReader + DOM

  • 長所:SimpleXMLと同程度のメモリを使用し、かつ XMLReader::expand() は新しい SimpleXMLElement を作成するよりも高速です。欲を言えば simplexml_import_dom() が使えればいいのですが、その場合はうまくいかないようです

  • 短所: DOMは扱うのが煩わしい。XMLReader と SimpleXML の中間のようなものです。XMLReader ほど複雑で厄介ではありませんが、SimpleXML で作業することからは何光年も離れています。

私のアドバイス:SimpleXMLでプロトタイプを書き、それがあなたのために働くかどうかを見てください。もしパフォーマンスが最優先なら、DOMを試してみてください。XMLReader からは可能な限り離れてください。書くコードが多ければ多いほど、バグを発生させたりパフォーマンスを低下させたりする可能性が高くなることを覚えておいてください。