Большая часть моей жизни, связанной с анализом XML, была потрачена на извлечение фрагментов полезной информации из грузовиков XML (Amazon MWS). Таким образом, мой ответ предполагает, что вам нужна только конкретная информация, и вы знаете, где она находится.
Я считаю, что самый простой способ использования XMLReader - это узнать, из каких тегов я хочу получить информацию, и использовать их. Если вы знаете структуру XML и в нем много уникальных тегов, я считаю, что использовать первый случай очень просто. Варианты 2 и 3 просто показывают вам, как это можно сделать для более сложных тегов. Это очень быстро; У меня есть обсуждение скорости на Какой самый быстрый парсер XML в PHP?
Самая важная вещь, которую следует помнить при выполнении синтаксического анализа на основе тегов, - это использовать 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();
}