PHP从XML中删除元素

时间:2013-04-09 16:08:49

标签: 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文件:

<?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>
有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

使用simplexml: - &gt;现场演示@ http://codepad.viper-7.com/Jl16Oh

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

}

答案 1 :(得分:1)

我认为比较日期就像是实施的数据类型一样有问题。

使用您的算法,您正在比较字符串,这不是您想要的。您可以使用preg_match获取日,月和年,然后使用mktime来比较时间戳:

http://php.net/manual/en/function.preg-match.php

http://php.net/manual/en/function.mktime.php

编辑:您甚至可以在没有preg_match的情况下执行此操作,这非常耗时。下面是一个将对象转换为数组的示例(您必须以某种方式进行转换,您还可以选择使用DOM,请参阅:Remove a child with a specific attribute, in SimpleXML for PHP

<?
$xml_file = (array)simplexml_load_file("file.xml")or die('Error reading XML file');
print_r($xml_file);

$today=array(
    'day'   => intval(date('d')),
    'month' => intval(date('m')),
    'year'  => intval(date('Y')),
    );
//print_r($today);

foreach($xml_file['task'] as $key=>$aTask) {
        $date  = (string)$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";
        if ( ($year < $today['year']) || ($year==$today['year'] && $month < $today['month']) || ($year==$today['year'] && $month == $today['month'] && $day < $today['day']) ) {
            //echo 'Deleting '.$aTask->title."\n";
            unset($xml_file['task'][$key]);
        }
}

// Inspired from: https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml 
$xml  = '<?xml version="1.0"?>'."\n".'<calendar>';
function addChild($item) { global $xml; $xml.=$item->asXML(); }
array_walk_recursive($xml_file['task'], 'addChild');
$xml .= '</calendar>';
//echo $xml;
file_put_contents('out.xml', $xml);
?>

答案 2 :(得分:1)

这实际上非常棘手。您必须unset()相应的变量,但它必须是对父节点的引用(即,unset($aTask)将不起作用)。此外,如果您foreach ($xml_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]);
}

P.S。如前所述,您的日期处理例程不起作用。

修改:我实际上尝试了我自己的代码和it works,所以downvoter应该自己解释一下。