2012-01-22 17 views
0

チャット内にhtmlのDOM要素がありますが、削除したい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 

削除するノードを識別するパスと削除するパスの2つのパスを作成します。これは、childNodesがアクティブなリストであるため、削除するときに転送を繰り返すことができないためです。 (それを逆戻りすることはできますが)

関連する問題