我有一根绳子
$xml
可能有也可能没有DOCTYPE标记。我有一个自定义DOCTYPE标记,其中包含要添加到的实体
$xml文件
$document = new \DOMDocument(); $document->loadXML($xml);
如何有效地确定
有doctype,如果没有,请添加我的自定义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片段,也适用于完整的文档。这还涉及到能够指定自定义doctype,因为所讨论的代码将来可能会处理其他doctype或更一般的XML情况。