2012-01-22 96 views
0

我有一个DOM元素与聊天室中的html包含一些html元素我想要删除,同时仍然保持一些标签没问题。DOM删除选定的子节点

我试图通过子元素遍历所有的子元素,并删除那些需要拆除

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

但这抛出一个没有被抓导致致命错误未找到错误例外。 我该如何解决这个问题?

回答

2

使用以下,而不是删除节点:

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

phew ...像一个魅力的作品,谢谢 –

+0

不适合我,现在也显示任何错误。 –

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是一个活动列表,所以我们不能在我们删除时向前迭代它。 (虽然我们可以向后迭代)