DOM删除选定的子节点

时间:2012-01-22 03:14:51

标签: php dom removechild

我有一个带有html内部聊天的dom元素,其中包含一些我想删除的html元素,同时仍保留一些可以正常使用的标记。

我尝试遍历所有子元素的子元素并删除那些需要删除的元素

foreach ($node->getElementsByTagName('*') as $element)
    if ($element->nodeName != 'br')
        $node->removeChild($element);

但是这会抛出一个Not Found Error异常,但是没有被捕获会导致致命的错误。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用以下代码删除节点:

$element->parentNode->removeChild($element);

答案 1 :(得分:2)

getElementsByTagName('*')找到所有后代元素,而不是元素。因此,您要删除的部分$element不是$node的子项,因此失败。

我不是100%确定你的意图是什么,但很可能你只想删除某些直接孩子。在这种情况下,请执行以下操作:

$nodestoremove = array();
foreach ($node->childNodes as $n) {
    if ($n->nodeType===XML_ELEMENT_NODE and $n->nodeName!=='br') {
        $nodestoremove[] = $n;
    }
}
foreach ($nodestoremove as $n) {
    $node->removeChild($n);
}
unset($nodestoremove); // so nodes can be garbage-collected

echo $node->C14N(); // xml fragment after removal

请注意,我们进行了两次传递:一次用于识别要删除的节点,另一次用于删除。这是因为childNodes是一个活动列表,因此我们无法在删除时迭代它。 (虽然我们可以向后迭代它。)