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