Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP从XML中删除元素_Php_Xml_Simplexml - Fatal编程技术网

PHP从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文件中删除元素

$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]);
}