Ошибка Simplexml со следующим сообщением об ошибке:
simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range
По моему мнению, жалоба касается недопустимого символа юникода. Строка 299108 не имеет «FFFE», но содержит «EFBFBE».
Есть ли способ обработать этот тип ошибок в simplexml?
Я много работал с входящими пользовательскими данными, и я исследовал множество способов его решения. Есть способы правильно кодировать входящие данные как 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);
Трюк заключается в том, чтобы взглянуть на свойства DOMDocument в документации PHP и заметить эти дополнительные переменные, которые позволяют вам устанавливать поведение синтаксического анализа. Этот метод работает без сбоев для меня, на всех входах xml, которые использовали для исключения SimpleXMLElement с проблемами диапазона символов.
Мое единственное предположение о том, почему это работает, – это то, что SimpleXMLElement выполняет строгую проверку инициализации, но не при инициализации из существующего DOMDocument.
Этот метод позволяет выполнять последующие вызовы asXML () без сбоев.