У меня странная ошибка, я не знаю, как это возможно. Xmlreader читает файл, но когда я пытаюсь повторить его, он все равно выдает мне сообщение «Message: 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 ()). Пожалуйста помоги
Я выяснил проблему: нужно переместить $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>';
}
Других решений пока нет …