代码之家  ›  专栏  ›  技术社区  ›  Jay Bienvenu

向DOMDocument添加缺少的doctype

  •  0
  • Jay Bienvenu  · 技术社区  · 6 年前

    我有一根绳子 $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 "&#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片段,也适用于完整的文档。这还涉及到能够指定自定义doctype,因为所讨论的代码将来可能会处理其他doctype或更一般的XML情况。

    0 回复  |  直到 6 年前