XMLReader编码错误

时间:2009-05-04 09:19:53

标签: php encoding xmlreader

我有一个PHP脚本试图解析一个巨大的XML文件。为此,我正在使用XMLReader库。在解析过程中,我遇到了这个编码错误:

输入不正确的UTF-8,表示编码!字节:0xA0 0x32 0x36 0x30

我想知道它们是否可以跳过包含不良字符的记录。

谢谢!

4 个答案:

答案 0 :(得分:8)

首先,确保您的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); 

答案 1 :(得分:2)

我会听听XMLReader告诉你的内容。请记住,许多编码都是ASCII的超集,因此(例如)UTF-8和ISO-8859-1与前128个代码点的ASCII相同。您的文件可能真的编码为ISO-8859-1,但几乎所有字符都来自该字符集的较低的ASCII半部分。在这种情况下,如果让它使用XML的默认编码UTF-8,则会出错。

在ISO-8859-1中,字节序列0xA0 0x32 0x36 0x30完全有效:一个不间断的空格,后跟'2','6','0'。

答案 2 :(得分:0)

如果您的XML文件结构非常简单,您可以“预先过滤”它以摆脱(甚至更好,更正)错误的记录。

按记录读取记录并写出已过滤的xml文件,然后处理过滤后的文件。

答案 3 :(得分:0)

$xml = file_get_contents('myxml.xml');
$xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml);
//parse $xml below