2012-03-10 3 views
3

У меня есть файл XML этой структурыУдаление 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> 

Чтобы удалить событие, у меня есть эта функция 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 позволяет удалять элементы с помощью ключевого слова unset() PHP.

Для вашего фрагмента кода, просто замените

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

с

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

Если запрос XPath возвратил соответствующий <event> элемент, мы поручаем SimpleXML к unset() это.


Помимо: здесь два вхождения [0], потому что:

  • xpath() возвращает массив, даже если только один элемент соответствует. Итак, [0] используется для получения первого элемента в этом массиве, который является элементом, который мы хотим удалить.
  • Элемент SimpleXMLElement, возвращаемый с $node[0], представляет собой набор элементов <event> (но если вы обращаетесь к элементам/атрибутам на нем, то используются значения из первого в коллекции). Итак, мы используем [0], чтобы получить фактический SimpleXMLElement, который мы хотим удалить, что является первым в этой магической коллекции.
+0

Спасибо за ответ. Я пошел с другим вариантом, потому что хочу иметь доступ к узлу как DOM. – user823527

+6

Это не ваш вопрос. – salathe