2009-07-20 190 views
5

我需要使用PHP刪除XML文件的元素。它將通過ajax完成,我需要通過屬性找到XML元素。PHP - 刪除XML元素

這是我的XML文件

<?xml version="1.0" encoding="utf-8"?> 
<messages> 
    <message time="1248083538"> 
     <name>Ben</name> 
     <email>Ben's Email</email> 
     <msg>Bens message</msg> 
    </message> 
    <message time="1248083838"> 
     <name>John Smith</name> 
     <email>[email protected]</email> 
     <msg>Can you do this for me?</msg> 
    </message> 
</messages> 

所以,我想說的是像在時間等於1248083838.

我一直使用簡單XML了刪除的元素到現在爲止我剛把意識到它可以做任何事情,除了刪除元素。

那麼我該怎麼做呢?

回答

7

您可以在PHP中使用DOM類。 (http://us3.php.net/manual/en/intro.dom.php)。

您需要將XML文檔讀入內存,使用DOM類進行操作,然後可以根據需要將XML保存到http或文件中。

DOMNode是那裏有刪除功能(解決您的問題)的對象。

它比SimpleXML的稍微複雜一些,但一旦你習慣了它,它的功能更加強大

(代碼例子半採取在php.net)

<?php 

$doc = new DOMDocument; 
$doc->load('theFile.xml'); 

$thedocument = $doc->documentElement; 

//this gives you a list of the messages 
$list = $thedocument->getElementsByTagName('message'); 

//figure out which ones you want -- assign it to a variable (ie: $nodeToRemove) 
$nodeToRemove = null; 
foreach ($list as $domElement){ 
    $attrValue = $domElement->getAttribute('time'); 
    if ($attrValue == 'VALUEYOUCAREABOUT') { 
    $nodeToRemove = $domElement; //will only remember last one- but this is just an example :) 
    } 
} 

//Now remove it. 
if ($nodeToRemove != null) 
$thedocument->removeChild($nodeToRemove); 

echo $doc->saveXML(); 
?> 

這應該給你對如何去除元素有點想法。它將打印出沒有該節點的XML。如果您想將其發送到文件,只需將該字符串寫入文件。

+0

嗯...我有點不知所措。你能解釋一下嗎? – 2009-07-20 13:59:48

+0

當然。我將編輯。 – 2009-07-20 14:01:33

+0

我沒有機會檢查小的語法錯誤 - 但是這應該給你類似你需要的東西。 我建議不要在forloop本身中刪除孩子,因爲它會與foreach的內部計數器混淆。 – 2009-07-20 14:11:46

9

戴夫·摩根是正確的在DOM類是功能更強大,但如果你想堅持的SimpleXML,嘗試使用任何節點上未設置()函數。例如。 unset($ simpleXMLDoc-> node1-> child1),並將從XML中刪除。

1

即使SimpleXML的沒有一個詳細的方式刪除元素,你可以刪除從SimpleXML的元素通過使用PHP的unset()。做到這一點的關鍵是設法瞄準期望的元素。至少有一種方法是使用元素的順序。首先找出你想要刪除(例如使用循環)元素的順序編號,然後刪除元素:

$target = false; 
$i = 0; 
foreach ($xml->message as $m) { 
    if ($m['time']=='1248083838') { $target = $i; break; } 
    $i++; 
} 
if ($target !== false) { 
    unset($xml->message[$target]); 
} 

你甚至可以刪除多個元素與此,通過存儲目標項目的訂單號在一個數組中。只要記得以相反的順序(array_reverse($targets))進行刪除,因爲刪除一個項目自然會減少後面項目的訂單數量。

無可否認,這是一個駭人聽聞的問題,但它似乎工作正常。