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()调用,而不会失败。