2013-04-09 96 views
-1

我的代码应该从jquery datepicker中选择一天,然后搜索我的xml文件并在选择列表中显示匹配元素的标题。当用户从列表中选择一个项目时,它应该从xml中删除该元素。PHP从XML中删除一个元素

下面是我的代码,删除部分出了问题。请帮助

PHP

//All tasks in Account 
echo "<strong>Delete Task</strong>"; 
echo "<br><br>"; 

echo '<form action="deleteTask.php" method="post">'; 
echo '<div>'; 
echo '<label for="date">Date </label>'; 
echo '<input type="text" id="datepicker_calender" name="date" required>'; 
echo '</div>'; 

echo '<h1>'; 
echo '<button type="submit">Submit</button>'; 
echo '</h1>';  

echo '</form>'; 
echo "<br><br>"; 

//Search task 
if (isset($_POST['date']) || isset($_POST['task'])) { 
    $xml_file = simplexml_load_file("account/" . $_COOKIE["Email"] . "/" . $_COOKIE["Email"] . ".xml"); 
    echo '<form action="deleteTask.php" method="post">'; 
    echo '<select name="task" required>'; 
foreach ($xml_file->task as $aTask) { 
    if ($aTask->date == $_POST['date']) { 
     echo '<option value="' . $aTask->title . '">' . $aTask->title . '</option>'; 
     } 
} 
    echo "</select>"; 

    echo '<h1>'; 
    echo '<button type="submit">Submit</button>'; 
    echo '</h1>';    
    echo '</form>'; 


    if (isset($_POST['task'])) { 
    foreach ($xml_file as $aTask) { 
     if ($aTask->title == $_POST['task']) { 
     unset($xml_file->task); 

     } 
    } 
    $xml_file->saveXML("account/" . $_COOKIE["Email"] . "/" . $_COOKIE["Email"] . ".xml"); 
    } 


    } 

XML

<?xml version="1.0"?> 
<calender> 
    <task> 
     <date>04/09/2013</date> 
     <title>test</title> 
     <description>test</description> 
    </task> 
    <task> 
     <date>04/09/2013</date> 
     <title>dfn sd</title> 
     <description>dfsf</description> 
    </task> 
    <task> 
     <date>04/10/2013</date> 
     <title>test</title> 
     <description>test</description> 
    </task> 
</calender> 
+1

“东西是错误的”?这是非常具体的。怎么了?它删除了错误?什么都不删?伸出你的电脑并删除你的银行账户? – 2013-04-09 19:29:31

回答

1

我不认为SimpleXML的提供了一种方法来删除XML节点[一切都在一个页面deleteTask.php上完成。为了使其工作,您需要使用DOM扩展名和dom_import_simplexml()方法。

参考:Remove a child with a specific attribute, in SimpleXML for PHP

此外,foreach创建元素的副本,因为它迭代。这意味着,为了让你的代码工作,你需要做这样的事情:

foreach ($xml_file as &$aTask) { 
    if ($aTask->title == $_POST['task']) { 
     unset($aTask); 
    } 
} 

注意在foreach声明引用其使得它的符号。

+0

所以,你说没有办法用SimpleXML删除XML节点,然后复制@James的答案并说你可以?编辑:詹姆斯谁删除了他的答案... – Shikiryu 2013-04-09 19:38:22

+0

是的,我正在阅读你参考的帖子,似乎nodename必须是唯一的,所以我删除了答案。 – James 2013-04-09 19:38:41

+0

我已经在添加答案的过程中...只是没有点击保存。 – 2013-04-09 19:38:49

0

我认为你需要一个更强大的XML引擎要做到这一点:

$dd = new DOMDocument; 
$dd->load($filename); 
$dx = new DOMXPath($dd); 

$nodeList = $dx->query("/calender/task[title='" . $_POST['task'] . "']"); // calendAr 
if ($nodeList->length == 1) { 
    $dd->documentElement->removeChild($nodeList->item(0)); 
} 

$dd->save($filename); 
+0

这行有一些错误:$ nodeList = $ dx-> query(“/ calender/task [@ title ='”。$ _POST ['task']。“']”); // calendAr当我使用它 – Void 2013-04-09 20:09:47

+0

是的,我认为你将标题存储为属性。固定。 – James 2013-04-09 20:13:33

+0

我没有看到修复? ps谢谢你的帮助 – Void 2013-04-09 20:19:01