我有一个PHP脚本,它试图解析一个巨大的XML文件。为此,我使用了XMLReader库。在解析过程中,我遇到了这样的编码错误:
输入不是正确的UTF-8,请指示编码!字节: 0xA0 0x32 0x36 0x30
我想知道它们是否是一种跳过包含错误字符的记录的方法。
谢谢!
发布于 2009-05-04 11:29:16
首先,确保您的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); 发布于 2009-05-04 12:11:40
我会听听XMLReader对你说的话。请记住,许多编码都是ASCII的超集,因此(例如)对于前128个代码点,UTF-8和ISO-8859-1与ASCII相同。很可能您的文件实际上是按照ISO-8859-1编码的,但中的几乎所有字符都来自该字符集的较低的ASCII半部分。在这种情况下,如果让它使用XML的默认编码UTF-8,那么错误就是您的了。
在ISO-8859-1中,字节序列0xA0 0x32 0x36 0x30是完全有效的:后跟“2”、“6”、“0”的不间断空格。
发布于 2009-05-04 11:35:12
如果您的XML文件的结构非常简单,那么您可以对其进行“预过滤”,以去除(或者更好地,纠正)错误的记录。
逐条记录读取并写出过滤后的xml文件,然后对过滤后的文件进行处理。
https://stackoverflow.com/questions/819414
复制相似问题