如何从DOMNode中获取innerHTML

时间:2011-07-12 20:43:35

标签: php dom xpath

我正在尝试使用<foo>元素替换DOMDocument中的所有<bar>元素。最好的方法是使用getElementsByTagName获取所有<foo>元素,然后创建新元素以替换它们。

问题是,我无法从被替换的元素中获取innerHTML。 nodeValue和textContent都返回内部文本,但内部标记被剥离。如何从DOMElement中获得类似于“innerHTML”的内容?

示例代码:

function convertTags($doc, $type) {

$bad_nodes = $doc->getElementsByTagName($type); 

foreach($bad_nodes as $bad_node) {
    $good_node = $doc->createElement("bar", $bad_node->nodeValue);
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 
}

return $doc;
} 

3 个答案:

答案 0 :(得分:3)

我认为你可以通过将它们视为实际节点来做得更好:

$good_node = $doc->createElement('bar');
foreach( $bad_node->childNodes as $kid )
{
    $good_node->appendChild( $kid );
}

答案 1 :(得分:0)

使用DOMDocument::saveHTML()方法,并指定要转储的节点。如果我了解您的示例中的哪些节点正在寻找从中提取HTML,请尝试类似:

foreach($bad_nodes as $bad_node) {
    $good_node = $doc->createElement("bar", $bad_node->nodeValue);
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 

    // Call saveHTML on the node you want to dump.
    $doc->saveHTML($bad_node);

}

答案 2 :(得分:0)

如果将坏元素的所有子节点移动到好元素中会发生什么?如果不使用innerHTML类型方法,是否可以这样做?

我相信saveHTML()应该返回你应用它的节点的标记,如果这对你有任何帮助的话。