2012-01-22 137 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是一個活動列表,所以我們不能在我們刪除時向前迭代它。 (雖然我們可以向後迭代)