Большая часть моей жизни, связанной с синтаксическим анализом XML, уходит на извлечение кусков полезной информации из грузовиков XML (Amazon MWS). Таким образом, мой ответ предполагает, что вам нужна только конкретная информация и вы знаете, где она находится.
Я считаю, что самый простой способ использовать XMLReader - это знать, из каких тегов мне нужна информация, и использовать их. Если вы знаете структуру XML и в нем много уникальных тегов, я считаю, что использовать первый случай проще простого. Случаи 2 и 3 предназначены только для того, чтобы показать вам, как это можно сделать для более сложных тегов. Это очень быстро; У меня есть обсуждение скорости на тему « Какой самый быстрый синтаксический анализатор XML в PHP?»
Самая важная вещь, которую следует помнить при выполнении подобного синтаксического анализа на основе тегов, - это использовать if ($myXML->nodeType == XMLReader::ELEMENT) {...
- который проверяет, что мы имеем дело только с открывающими узлами, а не с пробелами или закрывающими узлами или чем-то еще.
function parseMyXML ($xml) {
$myXML = new XMLReader();
$myXML->xml($xml);
while ($myXML->read()) {
if ($myXML->nodeType == XMLReader::ELEMENT) {
$tag = $myXML->name;
switch ($tag) {
case 'Tag1':
$variable = $myXML->readInnerXML();
break;
case 'Tag2':
while($myXML->read()) {
if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') {
$variable2 = $myXML->readInnerXML();
break;
}
}
break;
case 'Tag3':
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();
}