2009-05-04 94 views
1

我有一个PHP脚本试图解析一个巨大的XML文件。为此,我使用XMLReader库。在解析期间,我有这种编码错误:XMLReader编码错误

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

我想知道他们是否是一种跳过记录与坏字符的方式。

谢谢!

回答

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); 

如果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); 
+1

我试着打电话给libxml_use_internal_errors(真)函数处理我的XML文件之前,并添加 “LIBXML_NOERROR | LIBXML_NOWARNING” 面具的XMLReader ::打开()。这非常有帮助,但是当发现编码错误时解析仍然停止。你知道他们是否有办法告诉libxml在发现错误时继续解析。 – 2009-05-04 12:13:49

+0

关于评论的编辑答案。 – 2009-05-04 12:40:34

0

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

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

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'。

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