【问题标题】:XMLReader encoding errorXMLReader 编码错误
【发布时间】:2009-05-04 09:19:52
【问题描述】:

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

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

我想知道它们是否是一种跳过带有坏字符的记录的方法。

谢谢!

【问题讨论】:

    标签: php encoding xmlreader


    【解决方案1】:

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

    【讨论】:

    • 我尝试在处理我的 XML 文件之前调用 libxml_use_internal_errors(true) 函数并将“LIBXML_NOERROR | LIBXML_NOWARNING”掩码添加到 XMLReader::open()。这非常有用,但是当发现编码错误时解析仍然会停止。如果发现错误,您是否知道他们是否有任何方法告诉 libxml 继续解析。
    • 已编辑关于评论的答案。
    • 我尝试将整数值 1 传递给 $options 参数,但行为没有改变。发现编码错误时停止解析。
    • 而且您确定 XML 文件是 UTF-8 编码的并且 XMLReader 遇到的字节序列真的只是错误的?
    • 我无法确定,因为文件非常大 (>1Go) 并且是由客户端生成的。
    【解决方案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”。

    【讨论】:

      【解决方案3】:

      如果您的 XML 文件具有非常简单的结构,您可以“预过滤”它以去除(或者甚至更好地纠正)错误的记录。

      逐条读取并写出过滤后的xml文件,然后处理过滤后的文件。

      【讨论】:

        【解决方案4】:
        $xml = file_get_contents('myxml.xml'); $xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); //解析下面的$xml

        【讨论】:

        • 如果您要注意性能和所使用的内存量,那么将一个巨大的 XML 文件拉入一个字符串并不是一个很好的选择。
        猜你喜欢
        • 2014-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2011-07-26
        • 2013-06-04
        • 1970-01-01
        相关资源
        最近更新 更多