永发信息网

php删除xml某个节点

答案:2  悬赏:30  手机版
解决时间 2021-02-06 20:54
  • 提问者网友:练爱
  • 2021-02-06 03:18
这是我的xml
<?xml version="1.0" encoding="utf-8"?>
<TimePlan>
<BaseInfo TimePlanName="1234" BackupType="0"/>
<MainInfo PlanType="5">
<Day DayCount="1"/>
<Week Str=""/>
<Month Str=""/>
<Custom>
<Time Id="ce93197ad802b6bca1bbb3106ce5d35f" Time="2014-05-16 09:01:09"/>

<Time Id="19fb7ebcfcf078a5adb3c5fdafaf5d1d" Time="2014-05-16 09:21:00"/>
<Time Id="eb152567c8b7f140d89bc59c0e17e5f4" Time="2014-05-16 09:21:54"/>
</Custom>
</MainInfo>
</TimePlan>
我想删除Custom里面的Time id=ce93197ad802b6bca1bbb3106ce5d35f
效果为
<Custom>
<Time Id="19fb7ebcfcf078a5adb3c5fdafaf5d1d" Time="2014-05-16 09:21:00"/>
<Time Id="eb152567c8b7f140d89bc59c0e17e5f4" Time="2014-05-16 09:21:54"/>
</Custom>
请大神帮忙
最佳答案
  • 五星知识达人网友:拜訪者
  • 2021-02-06 04:28
$xml = <<<'endxml'
<?xml version="1.0" encoding="utf-8"?>
<TimePlan>
<BaseInfo TimePlanName="1234" BackupType="0"/>
<MainInfo PlanType="5">
<Day DayCount="1"/>
<Week Str=""/>
<Month Str=""/>
<Custom>
<Time Id="ce93197ad802b6bca1bbb3106ce5d35f" Time="2014-05-16 09:01:09"/>
<Time Id="ce93197ad802b6bca1bbb3106ce5d35f" Time="2014-05-16 09:01:09"/>
<Time Id="ce93197ad802b6bca1bbb3106ce5d35f" Time="2014-05-16 09:01:09"/>
<Time Id="ce93197ad802b6bca1bbb3106ce5d35f" Time="2014-05-16 09:01:09"/>

<Time Id="19fb7ebcfcf078a5adb3c5fdafaf5d1d" Time="2014-05-16 09:21:00"/>
<Time Id="eb152567c8b7f140d89bc59c0e17e5f4" Time="2014-05-16 09:21:54"/>
</Custom>
</MainInfo>
</TimePlan>
endxml;

$id = 'ce93197ad802b6bca1bbb3106ce5d35f';

// 正则表达式方式替换
function remove_node_str($xml , $id){

return preg_replace('/\<\S+\s+Id=(\'|")'.$id.'\1[^\/\>]*?\s*\/\>/im' , '' , $xml);

}

//dom方式替换
function remove_node_dom($xml , $id , $tag='Time'){

$dom = new DomDocument();
$dom->loadXML($xml);
$nodes = $dom->getElementsByTagName($tag);
$dels = array();
for($i = 0 , $len = $nodes->length ; $i < $len ; $i++){
if ($nodes->item($i)->getAttribute('Id') == $id ){
$dels[] = $nodes->item($i) ;
}
}

foreach($dels as $node ){
$node->parentNode->removeChild($node);
}

return $dom->saveXML();
}
echo remove_node_str($xml , $id);
echo remove_node_dom($xml , $id );
全部回答
  • 1楼网友:春色三分
  • 2021-02-06 04:46
直接unset($sxe)不行,那样子只是把$sxe释放了,但是不知为什么,对于叶子元素或者属性可以直接unset,如unset($sxe->$child);而子树却不行,不知道为什么simplexml没有提供一个通用的remove方法,我上次是转换成dom来做的[[i] 本帖最后由 呼噜猪 于 2007-8-8 10:22 编辑 [/i]]
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯