PHP从XML中删除元素
我想删除比现在旧的任务,但我还不知道如何从XML文件中删除元素PHP从XML中删除元素,php,xml,simplexml,Php,Xml,Simplexml,我想删除比现在旧的任务,但我还不知道如何从XML文件中删除元素 $xml_file = simplexml_load_file('file.xml'); foreach ($xml_file->task as $aTask) { if ($aTask->date < $today) { //$xml_file->removeChild($aTask); //doesnt work } } $xml_file
$xml_file = simplexml_load_file('file.xml');
foreach ($xml_file->task as $aTask) {
if ($aTask->date < $today) {
//$xml_file->removeChild($aTask); //doesnt work
}
}
$xml_file=simplexml_load_file('file.xml');
foreach($xml_文件->任务作为$aTask){
如果($aTask->date<$today){
//$xml_file->removeChild($aTask);//不起作用
}
}
下面是我的XML文件:
<?xml version="1.0"?>
<calender>
<task><date>00/00/0000</date><title>My Birthday</title><description>Today is my birthday!</description></task><task><date>04/01/2013</date><title>ghh</title><description>jfhjhj</description></task><task><date>04/01/2013</date><title>egfwe</title><description>wefwef</description></task><task><date>04/01/2013</date><title>cvbhm</title><description>dhmdh</description></task><task><date>04/02/2013</date><title>gg</title><description>gg</description></task><task><date>04/02/2013</date><title>test</title><description>test</description></task><task><date>04/03/2013</date><title>ggg</title><description>ggg</description></task><task><date>04/03/2013</date><title>ssdv</title><description>ssdvs</description></task><task><date>04/03/2013</date><title>test</title><description>testtest</description></task><task><date>04/04/2013</date><title>tttt</title><description>ttttttttt</description></task><task><date>04/05/2013</date><title>qewerbqwer</title><description>bwerbwerbwebr</description></task><task><date>04/07/2013</date><title>fgj</title><description>fghj f</description></task><task><date>04/08/2013</date><title>test</title><description>swdefswde</description></task><task><date>04/09/2013</date><title>hj,h</title><description>hj,gh</description></task><task><date>04/16/2013</date><title>dfbd</title><description>dfbdfb</description></task><task><date>04/17/2013</date><title>dfb</title><description>dfb</description></task>
</calender>
我的生日今天是我的生日!2013年1月4日GHHJFHJHJ04/01/2013EGFWEWEF04/01/2013CVHMDHMDH04/02/2013gggg04/02/2013gggg04/03/2013SSDVSSSDVS04/03/2013TestTestTestTest 04/04/2013TTTTTTTTTTTTTT04/05/2013Qewerbwerbwerbwerbwerb04/07/2013FGJFGHJJJH04/08/2013testswdefswde04/09/2013hj,gh04/16/2013DFBB04/2013DB
有人能帮我吗?我认为比较日期是有问题的,好像它是一种实现的数据类型 使用您的算法,您正在比较字符串,这不是您想要的。您可以使用preg_match获取日期、月份和年份,然后使用mktime比较时间戳: 编辑:您甚至可以在不进行预匹配的情况下进行编辑,这非常耗时。下面是一个将对象强制转换为数组的示例(您必须以某种方式强制转换,也可以选择使用DOM,请参见:)
intval(日期('d')),
“月”=>intval(日期('m')),
'year'=>intval(日期('Y')),
);
//印刷(今天);
foreach($xml_文件['task']作为$key=>$aTask){
$date=(字符串)$aTask->date;
$month=intval($date[0]。$date[1]);
$day=intval($date[3]。$date[4]);
$year=intval($date[6]。$date[7]。$date[8]。$date[9]);
//echo$aTask->title.:'.$month./'.$day./'.$year.\n“;
如果($year=$today['year'])| |($year==$today['year']和&$month<$today['month'])|($year=$today['year']和&$month=$today['day']){
//回显“删除”。$aTask->title。“\n”;
取消设置($xml_文件['task'][$key]);
}
}
//灵感来自:https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml
$xml=''。\n'';
函数addChild($item){global$xml;$xml.=$item->asXML();}
数组_walk_recursive($xml_文件['task'],'addChild');
$xml.='';
//echo$xml;
文件内容('out.xml',$xml);
?>
使用simplexml
:-->live demo@
$xml=simplexml\u load\u string($x);//XML的单位是$x
$today=日期(“m/d/Y”);
$max=$xml->task->count()-1;
对于($i=$max;$i>=0;$i--){
如果($xml->task[$i]->date<$today)未设置($xml->task[$i]);
}
这其实很棘手。您必须unset()
适当的变量,但它必须是对父节点的引用(即unset($aTask)
将不起作用)。此外,如果您使用foreach($xml\u file->task as$index=>$aTask)
跟踪子位置,您将在每次迭代中获得task
您需要一些像这样的丑陋代码:
$index = 0;
$remove = array();
foreach ($xml_file->task as $aTask) {
if ($aTask->date < $today) {
$remove[] = $index;
}
$index++;
}
foreach($remove as $index){
unset($xml_file->task[0]);
}
$index=0;
$remove=array();
foreach($xml_文件->任务作为$aTask){
如果($aTask->date<$today){
$remove[]=$index;
}
$index++;
}
foreach($作为$index删除){
取消设置($xml_文件->任务[0]);
}
注:如前所述,您的日期处理程序不起作用
编辑:我实际上已经尝试了我自己的代码,所以downvoter应该解释自己。你能展示一下
$aTask->date
和$today
包含的内容吗?解释:你可以向后循环,这样删除节点后索引保持不变。这是答案,很好。@michi,我不得不说它很干净+1.我尝试了您的代码,但无法通过$xml\u文件['task']
,这会触发警告:为foreach()提供的参数无效。
。您是否尝试了完全相同的代码,包括对数组的强制转换?因为它对我有用。也许你有一个旧版本的PHP?哦,对不起,我忽略了(数组)
位。然后,我认为您应该澄清如何取回XML代码,因为它不是很明显。@lvaroG.Vicario:done,但显然Michi解决方案将比我的快得多。
$xml = simplexml_load_string($x); // XML is in $x
$today = date("m/d/Y");
$max = $xml->task->count()-1;
for ($i = $max; $i >=0; $i--) {
if ($xml->task[$i]->date < $today) unset($xml->task[$i]);
}
$index = 0;
$remove = array();
foreach ($xml_file->task as $aTask) {
if ($aTask->date < $today) {
$remove[] = $index;
}
$index++;
}
foreach($remove as $index){
unset($xml_file->task[0]);
}