首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多段超文本标记语言组装成一个DOMDocument?

如何将多段超文本标记语言组装成一个DOMDocument?
EN

Stack Overflow用户
提问于 2011-01-19 01:18:43
回答 2查看 406关注 0票数 1

表示文档各部分的文件的loadHTMLloadHTMLFile似乎填充了每个部分的htmlbody标记,如我使用以下内容输出时所示:

代码语言:javascript
复制
$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来做这件事,那么我可以做些什么来防止这种行为呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-19 01:28:03

您能得到的最接近的方法是使用DOMDocumentFragment

然后您可以执行以下操作:

代码语言:javascript
复制
$doc = new DOMDocument();
...
$f = $doc->createDocumentFragment();
$f->appendXML("<foo>text</foo><bar>text2</bar>"); 
$someElement->appendChild($f);

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

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

票数 0
EN

Stack Overflow用户

发布于 2011-01-19 01:31:06

这是HTML parser module of libxml为了处理损坏的超文本标记语言而对文档所做的几项修改的一部分。只有在部分标记上使用loadHTMLloadHTMLFile时才会出现这种情况。如果您知道partial是有效的X(HT)ML,请改用loadloadXML

你可以使用

代码语言:javascript
复制
$doc->saveXml($doc->getElementsByTagName('body')->item(0));

要转储body元素的outerHTML,例如<body>anything else</body>并使用str_replace剥离body元素,或者使用substr提取内部html。

代码语言:javascript
复制
$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语言的标记,因此<br>将成为<br/>。从PHP5.3.5开始,不能将节点传递给saveHTML()A bug request has been filed.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4726969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档