PHP从XML中删除一个元素

时间:2013-04-09 19:28:14

标签: php jquery xml

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

以下是我的代码,删除部分有问题。请帮忙 [一切都在一页上完成deleteTask.php]

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>

2 个答案:

答案 0 :(得分:1)

我不认为SimpleXML提供了删除XML节点的方法。为了使其有效,您需要使用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声明中的&符号,它通过引用来形成。

答案 1 :(得分: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);