9

I have an xml file of this structure

<?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> 

To delete an event, I have this php function.

<?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'])); ?> 

That doesn't delete the node. Is there a different way to do this?

0

2 Answers 2

21

SimpleXML allows removal of elements via PHP's unset() keyword.

For your code snippet, simply replace

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

with

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

If the XPath query returned a matching <event> element, we instruct SimpleXML to unset() it.


Aside: here are two occurrences of [0] because:

  • xpath() returns an array, even if only one element matches. So [0] is used to get the first item in that array, which is the element we want to delete.
  • The SimpleXMLElement returned from $node[0] represents a collection of <event> elements (but if you access elements/attributes on it then the values from the first in the collection is used). So, we use [0] to get at the actual SimpleXMLElement that we want to delete, which is the first in this magical collection.
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for the answer. I went with the other option because I want to be able to access the node as a DOM.
That's not what your question asked.
@salathe point about the second [0] index was particularly helpful and is a big gotcha.
11

Use unset(): Remove a child with a specific attribute, in SimpleXML for PHP

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.