私の XML 解析人生のほとんどは、大量の XML (Amazon MWS) から有益な情報を抽出することに費やされています。そのため、私の回答は、特定の情報のみが必要であり、その場所がわかっていることを前提としています。
XMLReader を使用する最も簡単な方法は、どのタグから情報を取り出したいかを知り、それらを使用することです。XML の構造を知っていて、固有のタグがたくさんある場合は、最初のケースを使用するのが簡単であることがわかります。ケース 2 と 3 は、より複雑なタグに対してどのように実行できるかを示すためのものです。これは非常に高速です。PHP で最速の XML パーサーは何ですか?で速度について議論しています。
このようなタグベースの解析を行う際に覚えておくべき最も重要なことは、使用するif ($myXML->nodeType == XMLReader::ELEMENT) {...
ことです。これにより、空白やノードの終了などではなく、ノードを開くことのみを処理していることを確認します。
function parseMyXML ($xml) { //pass in an XML string
$myXML = new XMLReader();
$myXML->xml($xml);
while ($myXML->read()) { //start reading.
if ($myXML->nodeType == XMLReader::ELEMENT) { //only opening tags.
$tag = $myXML->name; //make $tag contain the name of the tag
switch ($tag) {
case 'Tag1': //this tag contains no child elements, only the content we need. And it's unique.
$variable = $myXML->readInnerXML(); //now variable contains the contents of tag1
break;
case 'Tag2': //this tag contains child elements, of which we only want one.
while($myXML->read()) { //so we tell it to keep reading
if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') { // and when it finds the amount tag...
$variable2 = $myXML->readInnerXML(); //...put it in $variable2.
break;
}
}
break;
case 'Tag3': //tag3 also has children, which are not unique, but we need two of the children this time.
while($myXML->read()) {
if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') {
$variable3 = $myXML->readInnerXML();
break;
} else if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Currency') {
$variable4 = $myXML->readInnerXML();
break;
}
}
break;
}
}
}
$myXML->close();
}