[解決済み] PHPでXMLReaderを使うには?
質問
私は以下の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 からは可能な限り離れてください。書くコードが多ければ多いほど、バグを発生させたりパフォーマンスを低下させたりする可能性が高くなることを覚えておいてください。
関連
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。