我有一个字符串$xml
,该字符串可能带有DOCTYPE标记,也可能没有。我有一个自定义DOCTYPE标记,其中包含要添加到$xml
的实体(如果尚没有DOCTYPE)。我将使用$document = new \DOMDocument(); $document->loadXML($xml);
创建一个DOMDocument。
如何有效地确定$xml
是否具有doctype并添加我的自定义DOCTYPE标记(如果没有)? createDocumentType()
不提供添加实体或符号的方法。
在进行$xml
上的模式匹配时,优先使用DOM模型。
更新:基于有关修改传入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情况。