Removing a simplex node
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 remove 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']));
?>
This does not remove node. Is there any other way to do this?
+3
source to share
2 answers
SimpleXML allows you to remove elements using the PHP keyword unset()
.
For your code snippet, just replace
$node->parentNode->removeChild($node);
from
if ( ! empty($node)) {
unset($node[0][0]);
}
If the XPath query returned a matching element <event>
, we will instruct SimpleXML on unset()
it.
Also: here are two occurrences [0]
because:
-
xpath()
returns an array even if only one element matches. So it is[0]
used to get the first element in this array, which is the element we want to remove. - The SimpleXMLElement returned from
$node[0]
is a collection of elements<event>
(but if you access elements / attributes on it, then the values ββfrom the first in the collection are used). So, we use[0]
to get the actualSimpleXMLElement
one we want to delete, which is the first in this magic collection.
+14
source to share