Ошибка кодирования XMLReader

У меня есть PHP-скрипт, который пытается разобрать огромный файл XML. Для этого я использую библиотеку XMLReader. Во время синтаксического анализа у меня есть эта ошибка кодирования:

Ввод не соответствует UTF-8, укажите кодировку! Байты: 0xA0 0x32 0x36 0x30

Я хотел бы знать, являются ли они способом пропустить записи с плохими символами.

Спасибо!


person Michael Alves    schedule 04.05.2009    source источник


Ответы (4)


Прежде всего, убедитесь, что ваш XML-файл действительно имеет кодировку UTF-8. Если нет, укажите кодировку в качестве второго параметра XMLReader::open().

Если ошибка кодирования связана с реальной неправильной последовательностью байтов в документе UTF-8 и если вы используете PHP > 5.2.0, вы можете передать LIBXML_NOERROR и/или (в зависимости от уровня ошибки) LIBXML_NOWARNING в качестве битовой маски для третьего параметра. из XMLReader::open():

$xml = new XMLReader(); 
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING); 

Если вы используете PHP > 5.1.0, вы можете исправить ошибку libXML. -умение обращаться.

// enable user error handling
libxml_use_internal_errors(true);
/* ... do your XML processing ... */
$errors = libxml_get_errors();
foreach ($errors as $error) {
    // handle errors here
}
libxml_clear_errors();

На самом деле я не знаю, действительно ли предыдущие два обходных пути позволяют XMLReader продолжать чтение в случае ошибки или они только подавляют вывод ошибки. Но попробовать стоит.


Ответ на комментарий:

libXML определяет XML_PARSE_RECOVER (1), но ext/libxml не предоставляет этого константа как константа PHP. Возможно, можно передать целочисленное значение 1 в параметр $options.

$xml = new XMLReader(); 
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1); 
person Stefan Gehrig    schedule 04.05.2009
comment
Я попытался вызвать функцию libxml_use_internal_errors(true) перед обработкой моего XML-файла и добавить LIBXML_NOERROR | Маска LIBXML_NOWARNING для XMLReader::open(). Это очень полезно, но синтаксический анализ все равно останавливается при обнаружении ошибки кодирования. Знаете ли вы, есть ли какой-либо способ сказать libxml продолжить синтаксический анализ, если обнаружена ошибка. - person Michael Alves; 04.05.2009
comment
Отредактированный ответ относительно комментария. - person Stefan Gehrig; 04.05.2009
comment
Я попытался передать целочисленное значение 1 параметру $options, но поведение не изменилось. Анализ останавливается, когда обнаруживается ошибка кодирования. - person Michael Alves; 04.05.2009
comment
И вы уверены, что файл XML имеет кодировку UTF-8 и что последовательность байтов, обнаруженная XMLReader, действительно ошибочна? - person Stefan Gehrig; 04.05.2009
comment
Я не мог быть уверен, потому что файл очень большой (> 1 ГБ) и создается клиентом. - person Michael Alves; 04.05.2009
comment
Разве в файле XML нет объявления XML, указывающего его кодировку? Как писал Алан М., последовательность байтов в ISO-8859-1 была бы вполне приемлемой. Я думаю, вам нужно пойти наоборот и проверить, какая кодировка используется... - person Stefan Gehrig; 04.05.2009

Я бы послушал, что вам говорит XMLReader. Помните, что многие кодировки являются надмножествами ASCII, поэтому (например) UTF-8 и ISO-8859-1 идентичны ASCII для первых 128 кодовых точек. Вполне может быть, что ваш файл действительно закодирован как ISO-8859-1, но почти все символы в нем взяты из младшей, ASCII-половины этого набора символов. В этом случае ваша ошибка будет заключаться в том, что вы разрешили использовать кодировку по умолчанию для XML, UTF-8.

В ISO-8859-1 последовательность байтов 0xA0 0x32 0x36 0x30 совершенно допустима: неразрывный пробел, за которым следуют «2», «6», «0».

person Alan Moore    schedule 04.05.2009

Если ваш XML-файл имеет действительно простую структуру, вы можете «предварительно отфильтровать» его, чтобы избавиться (или, что еще лучше, исправить) неправильные записи.

Прочитайте его запись за записью и запишите отфильтрованный XML-файл, а затем обработайте отфильтрованный файл.

person Csaba Kétszeri    schedule 04.05.2009

person    schedule
comment
Вытягивание огромного XML-файла в строку — не очень хороший вариант, если вы заботитесь о производительности и о том, сколько памяти вы используете. - person Dustin Blake; 20.10.2014