PHP - 来自使用XMLReader的单个解析的多个while循环

时间:2014-04-19 14:17:30

标签: php xpath simplexml xmlreader

使用XMLReader,我试图仅解析一个非常大的XML ONCE,但是从XML文件的一个解析中使用多个while循环,如下面的代码所示。那可能吗?通过仅解析大文件一次,似乎可以节省开销和内存消耗。

$reader = new XMLReader;
$reader->open('products.xml');
$dom = new DOMDocument;
$xpath = new DOMXpath($dom);

while ($reader->read() && $reader->name !== 'product') {
continue;
}

此while循环正确执行并使用值

填充数组
while ($reader->name === 'product') {
$node = $dom->importNode($reader->expand(), TRUE);

if ($xpath->evaluate('number(price)', $node) > $price_submitted) {
$name = $xpath->evaluate('string(name)', $node);
$nameArray[] = $name;
}
$reader->next('product');
}

这个while循环没有正确执行,没有任何回显,这需要在上面的一个单独的while循环中完成显示目的

while ($reader->name === 'product') {
$node = $dom->importNode($reader->expand(), TRUE);

if ($xpath->evaluate('number(price)', $node) > $price_submitted) {

$category = $xpath->evaluate('string(@category)', $node);
$name = $xpath->evaluate('string(name)', $node);
$price = $xpath->evaluate('number(price)', $node);

echo "Category: " . $category . ". ";
echo "Name: " . $name . ". ";
echo "Price: " . $price . ". ";
echo "<br>";
}
$reader->next('product');
}

使用simpleXML,您可以从文件的单个解析中使用多个foreach循环,我正在尝试使用上面的XMLReader。

foreach($XMLproducts->product as $Product) {
if ($Product->price > $price_submitted) {
$nameArray[] = $name;
}}

foreach($XMLproducts->product as $Product) {
if ($Product->price > $price_submitted) {
echo $Product->name . " " . $Product->price
}}

1 个答案:

答案 0 :(得分:0)

据我所知,XmlReader API只能向前工作,一旦你解析了一个节点,你就无法返回。因此,如果你有一个while循环消耗所有product元素,第二个循环将无法再找到这些元素,因为当第二个循环开始时读取器位于最后一个product元素之后。 SimpleXML是不同的,它构建了一个我认为的树,所以如果需要你可以返回并多次读出节点。如果您想使用XmlReader API,那么您必须编写一个循环读出product元素并缓冲您想要稍后输出或在不同位置输出的数据。