【问题标题】:xml reader opens the file but still gives the 'Load Data before trying to read' errorxml 阅读器打开文件,但仍然给出“尝试读取之前加载数据”错误
【发布时间】:2015-01-22 12:02:10
【问题描述】:

我有一个奇怪的错误,我真的不知道这怎么可能。 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 行是“while($reader->read())”行。请帮忙

【问题讨论】:

  • 看起来 xml 无效。你能证明使用 xml 验证器吗? (例如:validator.w3.org
  • 好像无效。该链接给了我“对不起!无法检查此文档。” xml文件其实就是这个链接grid.mk/rss/kultura我刚刚右键另存为。为什么会无效?
  • 第一个视图看起来不错。让我检查一下
  • 我将编码更改为 utf-8 现在可以“此文档已初步检查为 XML”,颜色为绿色。也许我的代码中的编码也有问题?
  • 可能...很难找出这里出了什么问题。我还在调查中

标签: php xmlreader


【解决方案1】:

我发现了问题:您需要将$reader-&gt;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 中的所有(!)标签,而您只对 &lt;item&gt; 节点感兴趣。我会在这里使用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>';
}

【讨论】:

  • 啊,伙计,这真是太棒了,我有一个男子汉的眼泪xD我要如何奖励你或smth? :)
  • 不客气!是的,很难找到,首先我完全走错了路:) ...
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多