将缺少的文档类型添加到DOMDocument

时间:2018-11-02 00:17:39

标签: php domdocument

我有一个字符串$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 "&#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 个答案:

没有答案