我想删除比现在更早的任务,但我还不清楚如何从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>
有人可以帮帮我吗?
答案 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应该自己解释一下。