PHP – очень простой XMLReader

Поскольку я буду разбирать очень большой XML-файл, я пытаюсь использовать XMLReader для извлечения данных XML и использовать simpleXML для отображения. Я никогда не использовал XMLreader, поэтому я просто пытаюсь понять, как использовать XMLReader. Я хочу отобразить все значения имени и цены в файле XML, и я не могу заставить этот код отображать что-либо. Я что-то упускаю?

Вот код XMLReader / simpleXML:

$z = new XMLReader; $z->open('products.xml'); $doc = new DOMDocument; while ($z->read() && $z->name === 'product') { $node = simplexml_import_dom($doc->importNode($z->expand(), true)); var_dump($node->name); $z->next('product'); } 

Вот XML-файл с именем products.xml :

 <products> <product category="Desktop"> <name> Desktop 1 (d)</name> <price>499.99</price> </product> <product category="Tablet"> <name>Tablet 1 (t)</name> <price>1099.99</price> </product> </products> 

Ваше состояние цикла сломано. Вы выполняете цикл, если вы получаете элемент AND, что имя элемента является « product ». Элемент документа является « products », поэтому условие цикла никогда не является TRUE .

Вы должны знать, что read() и next() перемещают внутренний курсор. Если он находится на узле <product> , read() переместит его к первому дочернему узлу этого узла.

 $reader = new XMLReader; $reader->open($file); $dom = new DOMDocument; $xpath = new DOMXpath($dom); // look for the first product element while ($reader->read() && $reader->localName !== 'product') { continue; } // while you have an product element while ($reader->localName === 'product') { $node = $reader->expand($dom); var_dump( $xpath->evaluate('string(@category)', $node), $xpath->evaluate('string(name)', $node), $xpath->evaluate('number(price)', $node) ); // move to the next product sibling $reader->next('product'); } 

Вывод:

 string(7) "Desktop" string(14) " Desktop 1 (d)" float(499.99) string(6) "Tablet" string(12) "Tablet 1 (t)" float(1099.99)