【问题标题】:How do I assemble pieces of HTML into a DOMDocument?如何将 HTML 片段组装到 DOMDocument 中?
【发布时间】:2011-06-11 05:59:10
【问题描述】:

对于代表 HTML 文档部分的文件,loadHTMLloadHTMLFile 似乎为每个部分填写了 htmlbody 标记,正如我输出以下内容时所显示的那样:

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$elements = $doc->getElementsByTagName('*');

if( !is_null($elements) ) {
    foreach( $elements as $element ) {
        echo "<br/>". $element->nodeName. ": ";

        $nodes = $element->childNodes;
        foreach( $nodes as $node ) {
            echo $node->nodeValue. "\n";
        }
    }
}

由于我计划在我自己的代码中将这些部分组装到更大的文档中,并且我被指示使用 DOMDocument 来执行此操作,我可以做些什么来防止这种行为?

【问题讨论】:

    标签: php html parsing dom


    【解决方案1】:

    这是HTML parser module of libxml 对文档所做的几项修改的一部分,以便处理损坏的 HTML。只有在部分标记上使用 loadHTMLloadHTMLFile 时才会发生这种情况。如果您知道部分是有效的 X(HT)ML,请改用 loadloadXML

    你可以使用

    $doc->saveXml($doc->getElementsByTagName('body')->item(0));
    

    转储body元素的outerHTML,例如&lt;body&gt;anything else&lt;/body&gt; 并用str_replace 剥离body 元素或用substr 提取内部html。

    $html = '<p>I am a fragment</p>';
    $dom = new DOMDocument;
    $dom->loadHTML($html); // added html and body tags
    echo substr(
        $dom->saveXml(
            $dom->getElementsByTagName('body')->item(0)
        ),
        6, -7
    );
    // <p>I am a fragment</p>
    

    请注意,这将使用符合 XHTML 的标记,因此 &lt;br&gt; 将变为 &lt;br/&gt;。从 PHP 5.3.5 开始,无法将节点传递给 saveHTML()A bug request has been filed.

    【讨论】:

    • 保存到 XML 并重新加载效率高吗?
    • @Hamster 在什么方面或与什么相比?我假设 i/o 性能与任何其他文件操作相同。需要时间的是从/到 DOM 实例的(反)序列化。如果您对性能有任何顾虑,请考虑运行基准测试。
    【解决方案2】:

    您最接近的是使用DOMDocumentFragment

    那么你可以这样做:

    $doc = new DOMDocument();
    ...
    $f = $doc->createDocumentFragment();
    $f->appendXML("<foo>text</foo><bar>text2</bar>"); 
    $someElement->appendChild($f);
    

    但是,这需要 XML,而不是 HTML。

    无论如何,我认为您正在制造一个人为的问题。由于您知道行为是创建 htmlbody 标记,因此您可以从 body 标记中提取文件中的元素,然后将其导入到您正在组装最终文件的 DOMDocument 中。见DOMDocument::importNode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2011-12-28
      • 2014-02-07
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      相关资源
      最近更新 更多