У меня есть строка $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 """>
<!ENTITY amp "&">
<!ENTITY nbsp " ">
]>
XML;
$xml = '<a> </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 """>
<!ENTITY amp "&">
<!ENTITY nbsp " ">
]>
<a> </a>
Fatal Error 26: Entity 'nbsp' not defined
К вашему сведению, ответ не такой: «похоже, вы работаете с HTML, используйте loadHTML () вместо loadXML ()». Данный код работает как с HTML-фрагментами, так и с полными документами. Это также касается возможности указания пользовательских типов документов, так как рассматриваемый код может обрабатывать другие типы документов или более общие случаи XML в будущем.