Ошибка кодировки XMLReader - PullRequest
1 голос
/ 04 мая 2009

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

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

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

Спасибо!

Ответы [ 4 ]

8 голосов
/ 04 мая 2009

Прежде всего, убедитесь, что ваш 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); 
2 голосов
/ 04 мая 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'.

0 голосов
/ 08 декабря 2009
$xml = file_get_contents('myxml.xml');
$xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml);
//parse $xml below

0 голосов
/ 04 мая 2009

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

Чтение записи по записи и запись отфильтрованного файла XML, затем обработка отфильтрованного файла.

...