xml reader 打开文件但仍然报 'Load Data before trying to read' 错误

xml reader opens the file but still gives the 'Load Data before trying to read' error

我有一个奇怪的错误,我真的不知道这怎么可能。 xmlreader 读取文件,但是当我尝试迭代它时,它仍然给我错误 "Message: XMLReader::read(): Load Data before trying to 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 是 "while($reader->read())" 行。请帮助

我发现了问题:您需要将 $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>';
}