Загрузка PHP DOMDocument XML со Сломанными XML-данными
Вопрос
Как вы справляетесь с поврежденными данными в XML-файлах?Например, если бы у меня был
<text>Some &improper; text here.</text>
Я пытаюсь сделать:
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->formatOutput = false;
$doc->load(...xml');
и это с треском проваливается, потому что существует неизвестная сущность.Обратите внимание, я не могу использовать CDATA из-за способа написания программного обеспечения.Я пишу модуль, который считывает и записывает XML, и иногда пользователь вставляет неправильный текст.
Я заметил, что DOMDocument-> loadHTML() прекрасно кодирует все, но как я мог продолжить оттуда?
Решение
Возможно, вы сможете использовать preg_replace_callback
выполнять за вас тяжелую работу с сущностями:
http://php.net/manual/en/function.preg-replace-callback.php
function fixEntities($data) {
switch(substr($data, 1, strlen($data) - 2)) {
case 'amp':
case 'lt':
case 'gt':
case 'quot': // etc., etc., etc.
return $data;
}
return '';
}
$xml = preg_replace_callback('/&([a-zA-Z0-9#]*);{1}/', 'fixEntities', $xml);
Другие советы
Использование htmlспециальные символы для сериализации специальных символов xml перед вводом входных данных в ваш xml / xhtml dom.Хотя его название имеет префикс "html", основанный на единственных символах, которые он заменяет, он действительно полезен для сериализации xml-данных.
Если вы тот, кто пишет xml, проблем возникнуть не должно, так как вы можете закодировать любой пользовательский ввод в entities, прежде чем помещать его в xml.