Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : SimpleXML functions : SimpleXMLElement->asXML()

SimpleXMLElement->asXML()

Return a well-formed XML string based on SimpleXML element ()

Example 2249. Get XML

<?php
$string
= <<<XML
<a>
<b>
 <c>text</c>
 <c>stuff</c>
</b>
<d>
 <c>code</c>
</d>
</a>
XML;

$xml = new SimpleXMLElement($string);

echo
$xml->asXML(); // <?xml ... <a><b><c>text</c><c>stuff</c> ...

?>

Example 2250.  Using asXML() on Xpath results

<?php
// Continued from example XML above.

/* Search for <a><b><c> */
$result = $xml->xpath('/a/b/c');

while(list( ,
$node) = each($result)) {
   echo
$node->asXML(); // <c>text</c> and <c>stuff</c>
}
?>

Related Examples ( Source code ) » simplexml element asxml






Code Examples / Notes » simplexml element asxml

fred trotter

When trying to use the DOMDocument method for pretty printing the output of asXML be careful how you format the starting XML string. It cannot have spaces or other hidden chars "\n". I also had trouble with using different types of quotes for the starting XML, but I am unable to replicate that. So if you cannot get this to work then you might try swapping the single and double quotes.
<?php
$no_spaces =  '<?xml version="1.0" encoding="UTF-8"?><Example></Example>';
$one_space =  '<?xml version="1.0" encoding="UTF-8"?><Example> </Example>';
echo printy($no_spaces);
/* Outputs
<?xml version="1.0"?>
<Example>
<poop from="Myself">
   <smell>stinky</smell>
 </poop>
</Example>
*/
echo printy($one_space);
/* Outputs... note the space...
<?xml version="1.0"?>
<Example> <poop from="Myself"><smell>stinky</smell></poop></Example>
*/
function printy($xmlstr){// a combination from the comments below...
$xml = new SimpleXMLElement($xmlstr);
$poop = $xml->addChild("poop");
$poop->addAttribute("from", "Myself");
$poop->addChild("smell", "stinky");
$doc = new DOMDocument('1.0');
$doc->formatOutput = true;
$domnode = dom_import_simplexml($xml);
$domnode = $doc->importNode($domnode, true);
$domnode = $doc->appendChild($domnode);
return $doc->saveXML();
}
?>


eggbird

One simple way to write out nicely indented XML data is by converting the whole batch to a DOM document, and using its formatOutput option:
$doc = new DOMDocument('1.0');
$doc->formatOutput = true;
$domnode = dom_import_simplexml($some_simplexml_node);
$domnode = $doc->importNode($domnode, true);
$domnode = $doc->appendChild($domnode);
echo $doc->saveXML();


blake w

Just a note to add onto the previous note: if your xml has already got a "\n" (new line) straight after the opening root tag, then the layout of the rest of the saveXML() will all be on one line, regardless of if you've set formatOutput to true. it's taken me about an hour to figure this out, and i hope this helps someone.

gary dot malcolm

I extended SimpleXml and added this code to give me pleasant source code XML. I'm sure it's ugly so if you can do it better go ahead...
<?php
   public function asPrettyXML()
   {
       $string = $this->asXML();
       /**
        * put each element on it's own line
        */
       $string =preg_replace("/>\s*</",">\n<",$string);
       /**
        * each element to own array
        */
       $xmlArray = explode("\n",$string);
       /**
        * holds indentation
        */
       $currIndent = 0;
       /**
        * set xml element first by shifting of initial element
        */
       $string = array_shift($xmlArray) . "\n";
       foreach($xmlArray as $element) {
           /** find open only tags... add name to stack, and print to string
            * increment currIndent
            */
           if (preg_match('/^<([\w])+[^>\/]*>$/U',$element)) {
               $string .=  str_repeat(' ', $currIndent) . $element . "\n";
               $currIndent += self::indent;
           }
           /**
            * find standalone closures, decrement currindent, print to string
            */
           elseif ( preg_match('/^<\/.+>$/',$element)) {
               $currIndent -= self::indent;
               $string .=  str_repeat(' ', $currIndent) . $element . "\n";
           }
           /**
            * find open/closed tags on the same line print to string
            */
           else {
               $string .=  str_repeat(' ', $currIndent) . $element . "\n";
           }
       }
       return $string;
   }
?>
Regards,
Gary Malcolm


shinnyleather

Awww snap. If you are to do something like this:
<?php
   // ... You have already read an xml file into a SimpleXMLElement stored in variable $poop
   $poop = $simpEle->addChild("poop");
   $poop->addAttribute("from", "Myself");
   $poop->addChild("smell", "stinky");
   
   file_put_contents("xml.xml", $poop->asXML());
?>
It will add all of the new xml on one line
<poop from="Myself"><smell>stinky</smell></poop>
So when you look at what was originally a nicely tabbed out xml file, it looks like doof. I understand why this happens, so let me just say that it would be awesome if someone wrote and shared function that takes the asXML() string, parses it, and returns a nicely tabbed out version. As a lot of the XML files I work with are smaller than large, the benefit of having a file readable to the human eye far outweights the benefit of having a smaller filesize.


Change Language


Follow Navioo On Twitter
SimpleXMLElement->addAttribute()
SimpleXMLElement->addChild()
SimpleXMLElement->asXML()
SimpleXMLElement->attributes()
SimpleXMLElement->children()
SimpleXMLElement->__construct()
SimpleXMLElement->getDocNamespaces()
SimpleXMLElement->getName()
SimpleXMLElement->getNamespaces()
SimpleXMLElement->registerXPathNamespace()
SimpleXMLElement->xpath()
simplexml_import_dom
simplexml_load_file
simplexml_load_string
eXTReMe Tracker