表示文档各部分的文件的loadHTML和loadHTMLFile似乎填充了每个部分的html和body标记,如我使用以下内容输出时所示:
$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来做这件事,那么我可以做些什么来防止这种行为呢?
发布于 2011-01-19 01:28:03
您能得到的最接近的方法是使用DOMDocumentFragment。
然后您可以执行以下操作:
$doc = new DOMDocument();
...
$f = $doc->createDocumentFragment();
$f->appendXML("<foo>text</foo><bar>text2</bar>");
$someElement->appendChild($f);但是,这需要XML,而不是HTML。
无论如何,我认为你正在制造一个人为的问题。由于您知道其行为是创建html和body标记,因此您可以从body标记中提取文件中的元素,然后将其导入到组装最终文件的DOMDocument中。参见DOMDocument::importNode。
发布于 2011-01-19 01:31:06
这是HTML parser module of libxml为了处理损坏的超文本标记语言而对文档所做的几项修改的一部分。只有在部分标记上使用loadHTML和loadHTMLFile时才会出现这种情况。如果您知道partial是有效的X(HT)ML,请改用load和loadXML。
你可以使用
$doc->saveXml($doc->getElementsByTagName('body')->item(0));要转储body元素的outerHTML,例如<body>anything else</body>并使用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语言的标记,因此<br>将成为<br/>。从PHP5.3.5开始,不能将节点传递给saveHTML()。A bug request has been filed.
https://stackoverflow.com/questions/4726969
复制相似问题