PHP - very basic XMLReader

落花浮王杯 提交于 2019-11-27 08:44:52

问题


Because I will be parsing a very large XML file, I am trying to use XMLReader to retrieve the XML data, and use simpleXML to display. I have never used XMLreader, so I am simply trying to get a basic feel for using XMLReader. I want to display all the name and price values in the XML file, and I cannot get this code to display anything. Am I missing something?

Here is the XMLReader/simpleXML code:

$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');
}

Here is the XML file, named 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>

回答1:


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)


来源:https://stackoverflow.com/questions/23072961/php-very-basic-xmlreader

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!