XML : In PHP, how to replace the DOMDocument::documentElement with a new element parent of the old documentElement?

Question:

How to create a super-root node that contain the previous documentElement?

Example scenario:

Given the following snippet in PHP, the encapsulateRootNode function has to create a new root node which contain the old full dom structure:

Example:

  <anyContent>...</anyContent>    

Become

  <newRoot><anyContent>...</anyContent></newRoot>    

The following code cannot be changed, and it has to be as fast as possible, so I discard any serialization, concatenation and parsing. I also would like to avoid to clone the full DOM structure.

  $doc = new \DOMDocument();  if(!@$doc->loadXML($xmlContent))  {      $myLibrary->encapsulateRootNode($doc, 'newRoot');  }    

My question is about how could I create the following function:

  public function encapsulateRootNode( $doc, $tagName )  {      ...  }    

Information search:

Usually, replaceChild is used for this kind of operation, but as there is no parent on which to call this function, I found myself lost in how to perform this operation.

I randomly tried some possibilities without success:

  $newXml = $doc->createElement( $tagName);  $newXml->appendChild($doc->documentElement);  // strange behaviours / warning using the resulting DOM    

or

  $newXml = $doc->createElement( $tagName);  $old = $doc->documentElement;  $doc->documentElement = $newXml;  $newXml->appendChild($old);  // documentElement is read only    

or even:

  $fragment = $doc->createDocumentFragment();  $newXml = $doc->createElement( $tagName);  $fragment->appendChild($newXml);  $newXml->appendChild($doc->documentElement);  // How to convert this fragment back to the normal domDocument?    

No comments:

Post a Comment