如何使用simplexml处理无效的unicode

geo*_*org 4 php xml

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

simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*zke 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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