Добавление отсутствующего типа документа в DOMDocument - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть строка $xml, которая может иметь или не иметь тег DOCTYPE. У меня есть собственный тег DOCTYPE с сущностями, которые я хочу добавить к $xml, если у него еще нет DOCTYPE. Я собираюсь создать DOMDocument с $document = new \DOMDocument(); $document->loadXML($xml);.

Как я могу эффективно определить, имеет ли $xml тип документа, и добавить мой собственный тег DOCTYPE, если его нет? createDocumentType() не предлагает средства для добавления сущностей или обозначений.

Предпочтение отдается использованию модели DOM по сравнению с сопоставлением с шаблоном $xml.

ОБНОВЛЕНИЕ: На основе комментария об изменении входящего XML приведен пример кода, демонстрирующий ситуацию:

\libxml_use_internal_errors(true);
\libxml_clear_errors();

$document = new \DOMDocument();
$document->xmlVersion = '1.0';
$document->encoding = 'UTF-8';

$doctype = <<<'XML'
<!DOCTYPE root [
<!ENTITY quot "&#34;">
<!ENTITY amp "&#38;">
<!ENTITY nbsp "&#160;">
]>

XML;

$xml = '<a>&nbsp;</a>';

$document->loadXML($xml);
if (\is_null($document->doctype)) {
    $document = new \DOMDocument();
    $document->xmlVersion = '1.0';
    $document->encoding = 'UTF-8';
    $document->loadXML($doctype.$xml);
    echo $doctype.$xml."\n";
}

foreach (\libxml_get_errors() as $error) {
    // make it pretty and echo it
}

Вот вывод:

<!DOCTYPE root [
<!ENTITY quot "&#34;">
<!ENTITY amp "&#38;">
<!ENTITY nbsp "&#160;">
]>
<a>&nbsp;</a>
Fatal Error 26: Entity 'nbsp' not defined

К вашему сведению, ответ не такой: «похоже, вы работаете с HTML, используйте loadHTML () вместо loadXML ()». Данный код работает как с HTML-фрагментами, так и с полными документами. Это также касается возможности указания пользовательских типов документов, так как рассматриваемый код может обрабатывать другие типы документов или более общие случаи XML в будущем.

...