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>
节点感兴趣。我会在这里使用 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>';
}
我有一个奇怪的错误,我真的不知道这怎么可能。 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>
节点感兴趣。我会在这里使用 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>';
}