Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP XMLReader解析行2次_Php_Xml_Xmlreader_Output - Fatal编程技术网

PHP XMLReader解析行2次

PHP XMLReader解析行2次,php,xml,xmlreader,output,Php,Xml,Xmlreader,Output,我正在解析一个xml文件。例如,当我输出一个属性时,我总是得到两次结果 以下是我所做工作的一些简化代码: $xml = new XMLReader(); $xml->open($file); while ($xml->read()) { if ($xml->name == 'file') echo $xml->getAttribute ('Product_ID') . '<br />';

我正在解析一个xml文件。例如,当我输出一个属性时,我总是得到两次结果

以下是我所做工作的一些简化代码:

    $xml = new XMLReader();

    $xml->open($file);

    while ($xml->read()) {
        if ($xml->name == 'file')
            echo $xml->getAttribute ('Product_ID') . '<br />';
    }

    // close stream
    $xml->close();

谢谢你的帮助

在文档中的注释中找到:

可能是显而易见的,但不是每个人;-)。。。读取属性时 从具有子节点的节点(并从此节点创建输出 节点),输出将发出两次,一次在标记上,另一次在 在结束标记上单击一次。为了避免这种情况,您可以测试 正在使用属性nodeType的节点的一部分。一个月一个 元素,15表示结束元素

您可以应用上述建议的解决方案,也可以使用另一种算法来遍历节点,如下所示:


更新 在评论中用建议的解决方案修改了您的代码

$xml = new XMLReader();

$xml->open($file);

while ($xml->read()) {
    if ($xml->name == 'file' && $xml->nodeType==XMLReader::ELEMENT)
        echo $xml->getAttribute ('Product_ID') . '<br />';
}

// close stream
$xml->close();
$xml=newXMLReader();
$xml->open($file);
而($xml->read()){
if($xml->name='file'&&$xml->nodeType==XMLReader::ELEMENT)
echo$xml->getAttribute('Product_ID')。
; } //密流 $xml->close();
有助于显示XML结构已更新。。。谢谢你的快速回答(stackoverflow初学者)没问题,这就是为什么,对于初学者来说,你在描述问题和提供关于尝试过的信息方面做得很好。大多数人一开始都失败了,并为此而梦想成真,所以kudos.simplexml不起作用,因为我加载的XML文件大于300MB。我必须逐行解析它们。
if ($xml->name == 'file' && $xml->nodeType == XMLReader::ELEMENT)
<?php
$xml = simplexml_load_file("test.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child)
  {
  echo $child->getName() . ": " . $child . "<br />";
  }
?>
$xml = new XMLReader();

$xml->open($file);

while ($xml->read()) {
    if ($xml->name == 'file' && $xml->nodeType==XMLReader::ELEMENT)
        echo $xml->getAttribute ('Product_ID') . '<br />';
}

// close stream
$xml->close();