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

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

据我了解,该投诉涉及无效的unicode字符。行299108没有“FFFE”,但包含“EFBFBE”。

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

最佳答案

我经常使用传入的用户数据来解决这个问题,并且我研究了许多方法来解决它。有一些方法可以将传入的数据正确地编码为UTF-8,而没有通常导致这些问题的高阶(或其他)unicode值。

但是, sanitizer 解决方案的问题在于它们会更​​改数据,并且,如果您只是想成为中间人,则仍然希望输出包含这些值。为了可靠地获得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()调用,而不会失败。

09-25 15:18