2013-04-09 90 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