Simplexml失败,并显示以下错误消息:
simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range
根据我的理解,投诉是关于无效的unicode角色。第299108行没有“FFFE”,但它包含“EFBFBE”。
有没有办法在simplexml中处理这类错误?
答案 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()调用,而不会失败。