2012-03-10 27 views
3

我有這樣的結構刪除的SimpleXMLElement節點

<?xml version="1.0" encoding="iso-8859-1"?> 
<my_events> 
         <event id="e20111129215359"> 
          <title>the title</title> 
          <channel id="1"> 
           <name>A name</name> 
           <onclick></onclick> 
          </channel> 
          <event_site> 
           <name/> 
           <url/> 
          </event_site> 
          <start_date>Thu Mar 08 2012</start_date> 
          <start_time>11:00 AM</start_time> 
          <end_date>null</end_date> 
          <end_time>null</end_time> 
          <notes>Notes for the event</notes> 
         </event> 
</my_events> 

的XML文件來刪除一個事件,我有這個PHP函數。

<?php 

include_once("phpshared.php"); 

function delete_event($nodeid) { 

    $nodes = new SimpleXMLElement('my_events.xml', LIBXML_NOCDATA, true); 

    $node = $nodes->xpath("/my_events/event[@id='$nodeid']"); 

    $node->parentNode->removeChild($node); 

    $formatted = formatXmlString($nodes->asXML()); 
    $file = fopen ('my_events.xml', "w"); 
    fwrite($file, $formatted); 
    fclose ($file); 

} 

echo delete_event(trim($_REQUEST['nodeid'])); 

?> 

這不會刪除節點。有沒有不同的方式來做到這一點?

回答

14

的SimpleXML允許通過PHP的unset()關鍵字消除元件。

對於您的代碼段,只需用

if (! empty($node)) { 
    unset($node[0][0]); 
} 

更換

$node->parentNode->removeChild($node); 

如果XPath查詢返回的匹配<event>元素,我們指示SimpleXML來unset()它。


旁白:這裏是[0]因爲兩次出現:

  • xpath()返回一個數組,即使只有一個元素相匹配。因此[0]用於獲取該數組中的第一個項目,這是我們要刪除的元素。
  • $node[0]返回的SimpleXMLElement表示<event>元素的集合(但如果您訪問元素/屬性,則使用集合中第一個元素的值)。因此,我們使用[0]來獲取我們要刪除的實際SimpleXMLElement,這是這個神奇集合中的第一個。
+0

感謝您的回答。我選擇了其他選項,因爲我希望能夠以DOM的身份訪問節點。 – user823527 2012-03-11 01:32:16

+6

這不是你問的問題。 – salathe 2012-03-11 11:28:46