2011-10-19 87 views
2

我在PHP中使用DOMDocument类删除了所有'body'元素的子节点。我的代码如下如何在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);它给了我错误

未捕获的异常 '抛出:DOMException' 有消息 C '未找到错误':\ XAMPP \ htdocs中\测试\ dum2.php :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

一个节点只能有一个父节点。所以我认为当你拨打$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

我试过了,它的nt工作。子节点不会从body元素中移除...即使我删除'$ wrapperDiv-> appendChild($ child);'... – samach

+0

@Salman:你如何测试是否有孩子? –

+0

我编辑了有问题的代码。 a.html文件包含div和img标签,... – samach