Remove nodes in SimpleXMLElement
by Matthias Willerich on July 15 2009, 18:56
SimpleXML provides no way to remove [...] XML nodes.
You might think otherwise and hack it with
unset(), as it was done in one of the web applications I inherited at work, but today I found out that this works under some conditions, but not with every setup. I'd love to tell you what exactly the differences are that make it break, but I didn't spend the time tracking it down.
I can tell you what
unset() did the the specific setup (PHP 5.1.2 on Windows Vista): Nothing. It happily executed it without error or warning, but also without changing anything.
Luckily S. Gehrig had a good and in my eyes not-hacky idea in a thread on stackoverflow.com: He suggests to use the DOM, specifically
dom_import_simplexml(), to then simply use
In my case I had a predictable XML structure to parse, and only needed to kick out the first of a set of nodes, so my solution (using the same xml setup as example) is as follows:
$data='<data> <seg id="A1"/> <seg id="A5"/> <seg id="A12"/> <seg id="A29"/> <seg id="A30"/> </data>'; $doc=new SimpleXMLElement($data); $dom=dom_import_simplexml($doc->seg); $dom->parentNode->removeChild($dom); echo $doc->asXml(); /*outputs: * <?xml version="1.0"?> * <data><seg id="A5"/><seg id="A12"/><seg id="A29"/><seg id="A30"/></data> */
For more complex XML structures (and probably closer to most real-life scenarios), I agree with S. in suggesting xpath as a way to detect your unwanted node.