2011-10-19 6 views
2

PHPのDOMDocumentクラスを使用して、 'body'要素のすべての子ノードを削除しています。 \ xamppの\ htdocsに\テスト\のdum2.php:PHPで子ノードを削除するには

$doc=new DOMDocument(); 
$doc->loadHTMLFile("a.html"); 

$wrapperDiv=$doc->createElement('div'); 
$wrapperDiv->setAttribute('class','wrapper'); 

$body= $doc->getElementsByTagName('body')->item(0); 
foreach($body->childNodes as $child) 
{ 

     if($child->nodeName != "#text") 
     { 
      $wrapperDiv->appendChild($child); 
      $body->removeChild($child); 
     } 

} 

$body->appendChild($wrapperDiv); 
$doc->saveHTMLFile('aaa.html'); 

$body->removeChild($child);でそれがキャッチされない例外 Cでメッセージ 'エラーが見つかりません' と 'のDOMException' 私に

をエラーが発生しますが、次のように私のコードです:70 Stack trace:#0 C:\ xampp \ htdocs \ test \ dum2.php(70): DOMNode-> removeChild(Object(DOMElement))#1 {main}が にスローされました。C:\ xampp \ htdocs \ test \ dum2.php on line 70

私はこの問題に長い間苦労してきましたが、このDOMDocumentクラスを初めて使用したときに問題が何であるか把握できませんでした。 'body'要素には子が含まれています!

答えて

3

ノードには親が1つしか存在できません。だから私はあなたが$wrapperDiv->appendChild($child);を呼んだとき、$childは、もはや$bodyの子ではないので、$body->removeChild($child);はエラーを投げると仮定します。

意味:既に削除されているので、子を削除する必要はありません。

一方、実際に子を削除して他の場所に追加しない場合は、$wrapperDiv->appendChild($child);を削除してください。

更新:

http://codepad.org/8udqSNMj

この問題を解決するには、逆の順序で子要素を反復しよう:確かに、いくつかの要素ノードが存在する場合、いないすべてのノードが移動しているようです

$children = $body->childNodes; 
for($i = $children->length; $i--;) { 
    $child = $children->item($i); 
    if($child->nodeName != "#text") { 
     $wrapperDiv->appendChild($child); 
    } 
} 

http://codepad.org/LtuJN2ZT

+0

私はそれを試して、それを動作させました。子ノードはbody要素から削除されません... '$ wrapperDiv-> appendChild($ child);を削除しても... ... – samach

+0

@Salman:子供がいるかどうかはどうやってテストしていますか? –

+0

問題のコードを編集しました。 a.htmlファイルにdivタグとimgタグが含まれています... – samach

関連する問題