最近的一个程序需要大量用到xml,于是也开始使用php的libxml,但在使用php的DOMDocument类删除节点时遇到不少的问题,removeChild不能跨节点删除,另外循环删除removeChild子节点时会出现不可预料的结果,每次删除时总会余下几个节点不能删除
首先遇到的一个问题是跨节点删除,看看下面这样一个例子
$xml = <<1 2 3 4 EOT; $objXML = new DOMDocument(); $objXML->loadXML($xml); $t = $objXML->getElementsByTagName('RColl')->item(0); $objXML->removeChild($t); print $objXML->saveXML();
这样删除就会报错,因为对象$t不是$objXML下面的节点,删除方法是找到被删除节点的父节点
$r = $objXML->getElementsByTagName('Template')->item(0);
$r->removeChild($t);
也可以这样
$t->parentNode->removeChild($t);
另外遇到一个问题就是循环删除子节点了,每次删除时总会有节点没有删除完,开始以为节点不同,于是全部改为简单的节点复制,一样会随机出现不能删除的问题,后来在这里找到了答案 http://www.phpman.com.cn/archives/275 英文方面可以在这里看到更多资料 http://us3.php.net/manual/en/domnode.removechild.php
因此将要删除的结点用数组暂存起来,最后再来删除
$xml = <<1 2 3 4 EOT; $objXML = new DOMDocument(); $objXML->loadXML($xml); $r = $objXML->getElementsByTagName('RColl'); foreach($r as $Node) { $delete[] = $Node; } foreach($delete as $val) { $val->parentNode->removeChild($val); } print $objXML->saveXML();
收藏php DOMDocument 删除节点removeChild遇到的问题到百度搜藏

(142)
(131)
(311)
(236)
(70)
(24)
(6)
(162)
(44)
(24)
(24)
(6)
(2)
(3)
(16)
(11)
(3)