PHP - 非常基本的XMLReader

时间:2014-04-15 01:05:57

标签: php xml simplexml 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>

1 个答案:

答案 0 :(得分:1)

您的循环条件已被破坏。如果你得到一个元素并且元素名称是“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)