2011-10-19 5 views
2

PHP에서 DOMDocument 클래스를 사용하여 'body'요소의 모든 자식 노드를 제거합니다. 다음과 같이 내 코드는 그것은 나를PHP에서 자식 노드를 제거하는 방법

C에서 '오류를 찾을 수 없음'catch되지 않은 예외 메시지 '예외 : DOMException'오류 제공 $body->removeChild($child);에서

$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'); 

: \ XAMPP \ htdocs를 \ 테스트 \의 dum2.php을 : 70 스택 추적 : # 0 C : \ xampp \ htdocs \ test \ dum2.php (70) : 에 던져진 DOMNode-> removeChild (Object (DOMElement)) # 1 {main} C : \ xampp \ htdocs \ test \ dum2.php on line 70

나는 오랫동안이 문제로 어려움을 겪어 왔지만이 DOMDocument 클래스를 처음 사용하기 때문에 문제가 무엇인지 파악할 수 없었다. '본문'요소에는 어린이가 포함됩니다!

답변

3

노드에는 부모가 하나만있을 수 있습니다. 따라서 $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

관련 문제