Добавление отсутствующего типа документа в DOMDocument

У меня есть строка $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 в будущем.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector