Your loop condition is broken. You loop if you get an element AND that elements name is "product
". The document element is "products
", so the loop condition is never TRUE
.
You have to be aware that read()
and next()
are moving the internal cursor. If it is on a <product>
node, read()
will move it to the first child of that node.
$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');
}
Output:
string(7) "Desktop"
string(14) " Desktop 1 (d)"
float(499.99)
string(6) "Tablet"
string(12) "Tablet 1 (t)"
float(1099.99)