PHP XmlReader — ошибка чтения при разборе

Для чтения файлов XML используйте:

$XMLFile = new XMLReader();

if($XMLFile->open('file.xml') === TRUE){                            

    while($XMLFile->read()) {

        //Do something

    }

    $XMLFile->close();

}

Если я найду в XML-файле образец строки:

!+_)(*&^%$#@!~}|"?,../;'\[]=-

Отображается критическая ошибка и парсинг прекращается:

Warning: XMLReader::read() [xmlreader.read]: file.xml:16: parser error : xmlParseEntityRef: no name in test.php on line 841
Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in test.php on line 841

В этом случае я хотел бы обработать ошибку и удалить файл xml. Может кто знает как исправить эту ошибку?


person Kuba    schedule 08.06.2013    source источник


Ответы (3)


Есть много разных способов справиться с состоянием ошибки, которое у вас есть. Но прежде всего, я думаю, вы должны знать, что XMLReader основан на libxml и libxml предлагает различные функции и даже объект LibXMLError для обработки ошибок:

$reader = new XMLReader();
if (!$reader->open($file)) {
    throw new RuntimeException('Unable to open file.');
}

while ($reader->read()) {
    //Do something
}

if (libxml_get_last_error()) {
    // There was an error reading the file
    unlink($file);
}

Пример информации об ошибке:

LibXMLError Object
(
    [level] => 3
    [code] => 68
    [column] => 12
    [message] => xmlParseEntityRef: no name

    [file] => /path/to/file.xml
    [line] => 2
)

Для этого примерного XML-файла:

<root>
    !+_)(*&^%$#@!~}|"?,../;'\[]=-
</root>

Если вы хотите уменьшить вывод ошибок, вы можете использовать так называемые внутренние ошибки в libxml.

Смотрите также:

person hakre    schedule 08.06.2013

У меня была такая же проблема. Проблема в том, что ваш XML недействителен. У вас не должно быть специальных символов в XML (т.е. & должно быть преобразовано в & во время создания XML-файла).

Для получения дополнительной информации см. эту похожую проблему.

В основном у вас есть два варианта:

  1. Вы можете исправить файл перед синтаксическим анализом (например, с помощью регулярного выражения)
  2. Вы можете исправить код, который генерирует XML в первую очередь
person Dejv    schedule 20.11.2013

Используйте XMLReader::isValid().

<?php $xml = XMLReader->open('file.xml');

// You have to use this:
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());
?>
person VNTeck    schedule 08.06.2013
comment
теперь у меня новая ошибка: ошибка проверки: ошибка проверки: DTD не найден! - person Kuba; 08.06.2013
comment
Для XML существует допустимый и корректный формат. Для правильного форматирования общий синтаксис должен быть правильным (соответствие тегов, правильное форматирование). Чтобы быть действительным, он должен быть правильно сформирован и соответствовать DTD. Без DTD оно может быть только правильно сформированным, но никогда не действительным. - person Shi; 30.10.2015
comment
Помимо других комментариев, XMLReader->open недействителен. Сначала вам нужно создать экземпляр XMLReader (на случай, если кто-то еще надеялся, что это может быть сокращением для открытия XML-файла). - person toast; 18.03.2019