Поскольку я буду разбирать очень большой 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)