SimpleXMLとXMLReaderとDomを組み合わせてPHPで巨大なXMLデータを高速に処理する方法

PHP, PECL, XML, XPATH

09:03:07, by admin Email , 125 words, 7116 views   Japanese (JP) del.icio.us

実測値は取ってないけどね。

(ノ・・)ン。。。。。。(((●コロコロッ


<?php

$rawXML = "<Items><Item>hoge</Item><Item><huga>hoge</huga></Item></Items>";
$items = array();
$reader = new XMLReader();
$reader->XML( $rawXML );

while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
switch( $reader->localName ){
case "Item":
$node = $reader->expand();
$dom = new DomDocument("1.0", "UTF-8");
$n = $dom->importNode($node,true);
$dom->appendChild($n);
$items[] = simplexml_import_dom($n);
break;
default:
break;
}
break;
default:
break;
}
}

print_R ($items );



XMLReader(SAX)で全体を処理し、
指定したタグ名(上記だとItem)だけを抽出。
抽出したタグはDom経由でsimpleXMLに通す。
結果としてDom経由でSimpleXMLElementの配列が取得できる。

って感じか。

[More:]



指定したタグ名のXMLデータを取得するロジック。
ちょうどDomDocumentのgetElementsByTagNameと似たような動作をする。
getElementsByTagNameの戻り値はDomNodeListだが、
これはSimpleXMLElementの配列が取れる。
DomよりもSimpleXMLの方が扱いやすいのでこの方が良いと思う。
Domの方が好きな人はsimplexml_import_domを外せば良い。
DomElementの配列が取れる。(それは微妙だが。)


PHP5以上、XMLReader, SimpleXML, DOMモジュール必要と導入の閾は少し高いが、
DomDocumentのgetElementsByTagNameを使いよりは高速に処理できるはず。
DomはXMLデータを全部読みとり構造解析をする動きをする。
その分のオーバーヘッドを軽減できるので、
XMLのファイルサイズが大きければ大きいほど差が出ると思う。





関連記事:
XML for PHP developers, Part 2: Advanced XML parsing techniques

Trackback address for this post:

http://hain.jp/htsrv/trackback.php/156

Comments, Trackbacks:

No Comments/Trackbacks for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites
PR

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!