xml阅读器打开文件,但仍然提供“尝试读取前加载数据”错误

时间:2015-01-22 12:02:11

标签: php xmlreader

我有这个奇怪的错误,我真的不知道这是怎么回事。 xmlreader读取文件,但是当我尝试迭代它时,它仍然给我错误"消息:XMLReader :: read():在尝试读取"之前加载数据。

这是我的代码:

$what = 'title';
    $reader = new XMLReader;

    if (!$reader->open(base_url().'resources/thexml.xml'))
    {
        die("Failed to open");
    }
    else 
    {
        echo 'success!';
    }


    while($reader->read())
    {
        if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item')
        {
            $exp = $reader->expand();
            if ($exp->nodeName == $what)
                echo "<b>" . $exp->nodeName . " : </b>" . $exp->nodeValue . "<br />";

        }

        $reader->close();
    }

这是输出:

成功! 遇到PHP错误

严重性:警告

消息:XMLReader :: read():在尝试读取之前加载数据

文件名:controllers / welcome.php

行号: 102

成功显示它读取文件但仍然给我错误,我需要先打开。行号102是&#34;而($ reader-&gt; read())&#34;线。请帮忙

1 个答案:

答案 0 :(得分:1)

我发现了问题:你需要在循环之外移动$reader->close();语句。否则,xml文档在第一个循环后关闭,后续读取操作失败。

读取循环应如下所示:

while($reader->read())
{
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item')
    {
        $exp = $reader->expand();
        if ($exp->nodeName == $what)
            echo "<b>" . $exp->nodeName . " : </b>" . $exp->nodeValue . "<br />";

    }
}

// Close the document after(!) the loop
$reader->close();

让您的代码正常运行。


但是,使用XMLReader似乎不是合适的解决方案。这是因为它需要循环输入xml中的所有(!)标记,而您只对<item>节点感兴趣。我会在这里使用DOMDocumentXPath

// Create an load the DOM document
$doc = new DOMDocument();
$doc->load('thexml.xml');

// Create an XPath selector
$selector = new DOMXPath($doc);

// Get all <title> nodes inside <item> nodes
foreach($selector->query('//item/title') as $item) {
    echo '<b>Title: ' . $item->nodeValue . '</br>';
}