我有一个PHP脚本试图解析一个巨大的XML文件。为此,我正在使用XMLReader库。在解析过程中,我遇到了这个编码错误:
输入不正确的UTF-8,表示编码!字节:0xA0 0x32 0x36 0x30
我想知道它们是否可以跳过包含不良字符的记录。
谢谢!
答案 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