@kobrasrealm at gmail dot com
there is no lack of deleteChild function, you should use the php function unset()
<?php
unset($myxml->book[0]->page[22]);
unset($myxml->book[1]->page);
?>
SimpleXMLElement->addChild
(No version information available, might be only in CVS)
SimpleXMLElement->addChild — Adds a child element to the XML node
Description
SimpleXMLElement
SimpleXMLElement addChild
( string $name
[, string $value
[, string $namespace
]] )
Adds a child element to the node and returns a SimpleXMLElement of the child.
Parameters
- name
-
The name of the child element to add.
- value
-
If specified, the value of the child element.
- namespace
-
If specified, the namespace to which the child element belongs.
Return Values
The addChild method returns a SimpleXMLElement object representing the child added to the XML node.
Examples
Example #1 Add attributes and children to a SimpleXML element
<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');
$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');
$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
jacob at 33i dot com dot au
20-Aug-2008 10:56
20-Aug-2008 10:56
essen at dev-extend dot eu
18-Jul-2008 01:06
18-Jul-2008 01:06
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.
kobrasrealm at gmail dot com
29-Jun-2008 06:22
29-Jun-2008 06: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.
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
30-Jan-2008 10:12
30-Jan-2008 10: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
19-Jan-2008 04:57
19-Jan-2008 04:57
Correct namespace usage:
<?php
$xml = new SimpleXMLElement('<root xmlns:itunes="http://example.com"/>');
$n = $xml->addChild("subtitle", "My Subtitle", " http://example.com");
?>
Incorrect namespace usage:
<?php
$xml = new SimpleXMLElement('<root xmlns:itunes="http://example.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
11-Jul-2007 01:37
11-Jul-2007 01: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 10:23
22-May-2007 10: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 10:49
12-Mar-2007 10: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.
