我有一个PHP脚本试图解析一个巨大的XML文件。为此,我使用XMLReader库。在解析期间,我有这种编码错误:XMLReader编码错误
输入不正确UTF-8,指示编码!字节:0xA0 0x32 0x36 0x30
我想知道他们是否是一种跳过记录与坏字符的方式。
谢谢!
我有一个PHP脚本试图解析一个巨大的XML文件。为此,我使用XMLReader库。在解析期间,我有这种编码错误:XMLReader编码错误
输入不正确UTF-8,指示编码!字节:0xA0 0x32 0x36 0x30
我想知道他们是否是一种跳过记录与坏字符的方式。
谢谢!
首先,确保您的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);
如果your're使用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);
如果您的XML文件结构非常简单,您可以“预过滤”它以摆脱(甚至更好,更正确)错误的记录。
通过记录读取记录并写出过滤的xml文件,然后处理过滤的文件。
我会听听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'。
$xml = file_get_contents('myxml.xml'); $xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); //parse $xml below
我试着打电话给libxml_use_internal_errors(真)函数处理我的XML文件之前,并添加 “LIBXML_NOERROR | LIBXML_NOWARNING” 面具的XMLReader ::打开()。这非常有帮助,但是当发现编码错误时解析仍然停止。你知道他们是否有办法告诉libxml在发现错误时继续解析。 – 2009-05-04 12:13:49
关于评论的编辑答案。 – 2009-05-04 12:40:34