Search code examples
phpsimplexml

SimpleXML: append one tree to another


I have two XML trees and would like to add one tree as a leaf to the other one.

Apparently:

$tree2->addChild('leaf', $tree1);

doesn't work, as it copies only the first root node.

Ok, so then I thought I would traverse the whole first tree, adding every element one by one to the second one.

But consider XML like this:

<root>
  aaa
  <bbb/>
  ccc
</root>

How do I access "ccc"? tree1->children() returns just "bbb"... .


Solution

  • You can't add a "tree" directly using SimpleXML, as you have seen. However, you can use some DOM methods to do the heavy lifting for you whilst still working on the same underlying XML.

    $xmldict = new SimpleXMLElement('<dictionary><a/><b/><c/></dictionary>');
    $kitty   = new SimpleXMLElement('<cat><sound>meow</sound><texture>fuzzy</texture></cat>');
    
    // Create new DOMElements from the two SimpleXMLElements
    $domdict = dom_import_simplexml($xmldict->c);
    $domcat  = dom_import_simplexml($kitty);
    
    // Import the <cat> into the dictionary document
    $domcat  = $domdict->ownerDocument->importNode($domcat, TRUE);
    
    // Append the <cat> to <c> in the dictionary
    $domdict->appendChild($domcat);
    
    // We can still use SimpleXML! (meow)
    echo $xmldict->c->cat->sound;