如何使用simplexml处理无效的unicode

时间:2011-10-14 10:38:41

标签: php xml

Simplexml失败,并显示以下错误消息:

simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range

根据我的理解,投诉是关于无效的unicode角色。第299108行没有“FFFE”,但它包含“EFBFBE”。

有没有办法在simplexml中处理这类错误?

1 个答案:

答案 0 :(得分:18)

我使用传入的用户数据遇到了很多,我研究了很多方法来解决它。有一些方法可以将输入数据正确编码为UTF-8,而不会出现经常导致这些问题的高阶(或其他)unicode值。

但是,清理解决方案的问题在于它们会更​​改数据,如果您只想成为中间人,则仍希望输出包含这些值。我能想出的唯一一种非破坏性的方法是让SimpleXMLElement可靠地不失败,就是要做到这一点,确实是双工解决方案:

    libxml_use_internal_errors(true);
    $dom = new DOMDocument("1.0", "UTF-8");
    $dom->strictErrorChecking = false;
    $dom->validateOnParse = false;
    $dom->recover = true;
    $dom->loadXML($xmlData);
    $xml = simplexml_import_dom($dom);

    libxml_clear_errors();
    libxml_use_internal_errors(false);

诀窍在于查看PHP文档中DOMDocument的属性,并注意那些允许您设置解析行为的额外变量。这个方法对我来说没有失败,因为用于使SimpleXMLElement的所有xml输入都因字符范围问题而失败。

我唯一猜测它的工作原理是SimpleXMLElement对初始化进行了严格的检查,但是从现有的DOMDocument初始化时却没有。

此方法允许后续的asXML()调用,而不会失败。