Easy and fast deleting of a node:
<?php
$oNode = dom_import_simplexml($oSimpleXMLNodeToDelete);
$oNode->parentNode->removeChild($oNode);
?>
The node can have childs, attributes, and be anywhere in your document, it'll get deleted. The deletion will appear immediately in your SimpleXML object after calling removeChild, there's nothing else to do.
SimpleXMLElement->addChild()
(PHP 5 >= 5.1.3)
SimpleXMLElement->addChild() — Fügt dem XML-Knoten ein Kind-Element hinzu
Beschreibung
SimpleXMLElement
SimpleXMLElement addChild
( string $name
[, string $value
[, string $namespace
]] )
Fügt ein Kind-Element an den Knoten und gibt ein SimpleXMLElement des Kindes zurück.
Parameter-Liste
- name
-
Der Name des hinzuzufügenden Kind-Elements.
- value
-
Wenn angegeben, der Wert des Kind-Elements.
- namespace
-
Wenn angegeben, der Namespace, zu dem das Kind-Element gehört.
Rückgabewerte
Die addChild-Methode gibt ein SimpleXMLElement-Objekt zurück, das das zum XML-Knoten hinzugefügte Kind repräsentiert.
Beispiele
Beispiel #1 Hinzufügen von Attributen und Kindern zu einem SimpleXML-Element
<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');
$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: Noch mehr Parser-Geschichten');
$movie->addChild('plot', 'Alles ueber die Leute, die das Kind am Leben erhalten.');
$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');
echo $sxe->asXML();
?>
SimpleXMLElement->addChild()
essen at dev-extend dot eu
17-Jul-2008 09:06
17-Jul-2008 09:06
kobrasrealm at gmail dot com
28-Jun-2008 02:22
28-Jun-2008 02:22
Here's a handy workaround to accommodate the lack of a $xml->deleteChild() function. It's not perfect, but it's a start (and it works for what I'm using it for):
<?php
// Workaround by Kobra. http://www.kobrasrealm.net
function simplexml_deleteChild($parent, $childname, $parentname)
{
$temp = simplexml_load_string(str_replace("#","?","<#xml version=\"1.0\"#>\n<".$parentname.">\n</".$parentname.">"));
foreach($parent as $t)
{
if($t->getName() != $childname)
{
$name = $t->getName();
$value = eval("return \$parent->".$name.";");
$temp->addChild($t->getName(), $value);
}
}
return $temp;
}
?>
I have not tested this with multi-level XML files; but like I said, it's a start.
danz at gethitz dot info
29-Jan-2008 05:12
29-Jan-2008 05:12
Object cloning ...
So using the 'clone' keyword here lets you work on $new separately, and attributes added to $new don't show up in $sxe
without the 'clone' all changes to $new will be reflected in the larger $sxe tree
$new = clone $sxe->AddChild("comment",$comment);
$new->AddAttribute("name",$name);
$new->AddAttribute("url",$url);
$new->AddAttribute("ip",$ip);
$new->AddAttribute("time",$time);
chicken dot ofeathers at gmail dot com
18-Jan-2008 11:57
18-Jan-2008 11:57
Correct namespace usage:
<?php
$xml = new SimpleXMLElement('<root xmlns:itunes="http://apple.com"/>');
$n = $xml->addChild("subtitle", "My Subtitle", " http://apple.com");
?>
Incorrect namespace usage:
<?php
$xml = new SimpleXMLElement('<root xmlns:itunes="http://apple.com"/>');
$n = $xml->addChild("subtitle", "My Subtitle", " itunes");
?>
The latter incorrect usage results in the following superfluous xmlns attribute:
<itunes:subtitle xmlns:itunes="itunes">My Subtitle</itunes:subtitle>
Whereas all you want is this:
<itunes:subtitle>My Subtitle</itunes:subtitle>
ron @ rotflol dot cx
10-Jul-2007 09:37
10-Jul-2007 09:37
Replacing a node is an easy mod of the simplexml_append
function simplexml_replace(SimpleXMLElement $parent, SimpleXMLElement $new_child){
$node1 = dom_import_simplexml($parent);
$dom_sxe = dom_import_simplexml($new_child);
$node2 = $node1->ownerDocument->importNode($dom_sxe, true);
$node1->parentNode->replaceChild($node2,$node1);
}
r dot versluis at millipede dot nl
22-May-2007 06:23
22-May-2007 06:23
<?php
// phpversion <= 5.1.2
function simplexml_addChild($parent, $name, $value=''){
$new_child = new SimpleXMLElement("<$name>$value</$name>");
$node1 = dom_import_simplexml($parent);
$dom_sxe = dom_import_simplexml($new_child);
$node2 = $node1->ownerDocument->importNode($dom_sxe, true);
$node1->appendChild($node2);
return simplexml_import_dom($node2);
}
function simplexml_addAttribute($parent, $name, $value=''){
$node1 = dom_import_simplexml($parent);
$node1->setAttribute($name,$value);
return simplexml_import_dom($node1);
}
?>
l dot j dot peters at student dot utwente dot nl
12-Mar-2007 06:49
12-Mar-2007 06:49
Rob Richards and I have come up with a very easy way to append one SimpleXML tree to another:
<?php
function simplexml_append(SimpleXMLElement $parent, SimpleXMLElement $new_child){
$node1 = dom_import_simplexml($parent);
$dom_sxe = dom_import_simplexml($new_child);
$node2 = $node1->ownerDocument->importNode($dom_sxe, true);
$node1->appendChild($node2);
}
?>
And adding a textnode is also easy:
<?php
//$sxe1 (refers to SimpleXMLElement)
$node1 = dom_import_simplexml($sxe1);
$node1->appendChild(new DOMText("my text"));
?>
Ofcourse, you could use this to extend the SimpleXMLElement class and overwrite and improve the existing addChild function.
Have fun, Luuk Peters.
