# Add Children with SimpleXML


By Ben Ramsey

Published on May 11, 2006


I was very excited today while glancing through the code in [ext/simplexml/simplexml.c](http://web.archive.org/web/20060618021635/http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/simplexml.c?view=markup) to find some, as of yet, undocumented methods in PHP's [SimpleXMLElement](http://php.net/SimpleXMLElement) class. This discovery came after I've spent several hours over the last couple of nights banging my head against the desk to figure out a way to create a class that extends SimpleXMLElement and adds a new method for adding a child, which would have to use [DOM](http://php.net/DOM) in order to work---or so I thought.

During this process, I've discovered two major limitations of SimpleXML:

* You cannot override the SimpleXMLElement constructor; it is a `final` method in the internals
* You can extend SimpleXMLElement and add new methods, but looping through child nodes creates new SimpleXMLElement objects that do not use your class and, thus, cannot use your methods

Nevertheless, I can get over these limitations after discovering these new SimpleXMLElement methods in PHP 5.1.4. In particular, the last three are what interest me most (<del datetime="2006-05-11T06:47:37+00:00">these are not yet documented in the [PHP manual](http://php.net/manual/en/index.php) </del>):

```
bool   SimpleXMLElement->registerXPathNamespace(string prefix, string uri)
array  SimpleXMLElement->getNamespaces([bool recursive])
array  SimpleXMLElement->getDocNamespaces([bool recursive])
string SimpleXMLElement->getName()
object SimpleXMLElement->addChild(string name [, string value [, string ns]])
void   SimpleXMLElement->addAttribute(string name, string value [,string ns])
```

Previously, one of the biggest limitations of SimpleXML was that you could not add new child nodes to an XML document. Adding attributes to an element was no problem, but in order to add a child element, you had to go a round-about way through importing the SimpleXML object to DOM with `dom_import_simplexml()`, adding the child element, and importing the DOM object back to SimpleXML with `simplexml_import_dom()`. This was messy and anything but simple.

Now, it's clean and simple, as SimpleXML should be:

```php
$xml = <<<XML
<books>
    <book title="Fahrenheit 451" author="Ray Bradbury"/>
    <book title="Stranger in a Strange Land" author="Robert Heinlein"/>
</books>
XML;

$sxe = new SimpleXMLElement($xml);

$new_book = $sxe->addChild('book');
$new_book->addAttribute('title', '1984');
$new_book->addAttribute('author', 'George Orwell');

echo $sxe->as<abbr title="">XML</abbr>;
```

<ins datetime="2006-05-11T06:47:37+00:00">**UPDATE:** I've added all of these (except for `registerXPathNamespace()`, which I can't seem to figure out) to the [documentation for SimpleXML](http://php.net/SimpleXML) in the PHP Manual. The documentation for each new method will be available the next time the scripts run to update the manual.</ins>


