Вопрос

Как вы справляетесь с поврежденными данными в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top