xml reader открывает файл, но все равно выдает ошибку «Загрузить данные перед попыткой чтения»

У меня странная ошибка, я не знаю, как это возможно. 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 ()). Пожалуйста помоги

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>';
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]