2014-02-05 111 views
0

我覺得我的問題會非常簡單,但我已經在很多方面嘗試過,並且它們都不起作用,我不知道還有什麼可以轉向。使用PHP刪除XML行

我想實現的是:我想從XML文件中刪除單個元素。

這種情況:我有一個真正簡單構建的XML文件。這將是在未來更復雜的,但現在它看起來像這樣:

XML

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
</list> 

顯示到一個HTML頁面此列表。現在,當它們被生成到頁面上時,它們被賦予一個數字,從0開始數起來。因此,第一種成分的數字爲0,第二種成分的數字爲1等。他們有一個onclick,它將我發送給持有該數字的jQuery。我已經測試過,工作正常。

現在就是它出錯的地方。我嘗試了Javascript的$ .ajax(),jQuery的$ .post(),甚至使HTML元素直接與帖子形式。他們似乎都沒有工作,即使我直接從其他地方複製示例。

我的PHP文件刪除的項目如下:

PHP

<?php 
header('Location:index.php'); 
$xmldoc = new DOMDocument(); 
$xmldoc->load('ingredients.xml'); 

$root = $xmldoc->firstChild; //Take the <list> tag 

$toDel = $_POST['itemToDel']; // This is the number received of the relevant item 

$root->removeChild(item($toDel)); 

$xmldoc->save('ingredients.xml'); 
?> 

沒有人對我有一個想法?當我用一個經過驗證的工作PHP代碼進行測試時,它並沒有實現,所以我有感覺介於PHP和Javascript之間的行爲,但它並沒有實現。截至目前,因爲我打消了我以前的嘗試,這是我的JavaScript現在:

function removeItem(item){ 

var itemToDel = item; // The number of the item to delete. 
var removeItem = $('.ingredient')[itemToDel].remove(); // removing the HTML parts 

//Remove the matching XML line 
} 

最後一刻編輯:我可以在我的XML文件中寫入(權限都OK了),我已經使用其他PHP腳本確實有效,所以localhost確實支持它。

回答

0

使用Xpath選擇要刪除的節點並將它們從各自的父節點中刪除。 DOMXpath :: evaluate()允許您使用Xpath表達式來獲取節點列表或標量值。在這種情況下,您需要一個包含一個或沒有元素節點的列表。

選擇文檔元素 「名單」 ...

/list

...裏面的 「成分」 元素......

/list/ingredient

...減少到一個元素的位置......

/list/ingredient[3]

示例源:

$xml = <<<'XML' 
<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
    <ingredient>Third item</ingredient> 
    <ingredient>Fourth item</ingredient> 
</list> 
XML; 

$xmldoc = new DOMDocument(); 
$xmldoc->loadXml($xml); 
$xpath = new DOMXpath($xmldoc); 

$toDel = 3; 
$expression = '/list/ingredient['.((int)$toDel).']'; 

foreach ($xpath->evaluate($expression) as $node) { 
    $node->parentNode->removeChild($node); 
} 

echo $xmldoc->saveXml(); 

輸出:

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 

    <ingredient>Fourth item</ingredient> 
</list> 
+0

謝謝你的回覆THW,但是我想問一下多一點。在你的例子中,你將$ toDel表示爲3,並且你知道這個數字是可變的。我的問題是從HTML頁面獲取這個數字到PHP中。我可以在我的HTML頁面中定義它,並且我可以將其轉換爲JavaScript,但是轉換到PHP似乎並不如此。 – Mortaza

+0

這個例子是自包含的,所以它可以在沒有外部依賴(文件,用戶輸入)的情況下執行。你必須適應它並再次使用'$ toDel = $ _POST ['itemToDel'];'。 – ThW

+0

這回答了我的問題:)原來我做了一個成功的調用我的PHP文件,但與建議的PHP刪除它,它實際上刪除它。最後一個問題:你如何在foreach-bit中使用evaluate()?它通過使用'。((int)$ toDel)不正確嗎?'或者我誤解評估()? – Mortaza