我有这个奇怪的错误,我真的不知道这是怎么回事。 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;线。请帮忙
答案 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>
节点感兴趣。我会在这里使用DOMDocument
和XPath
:
// 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>';
}