Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Format output of $SimpleXML->asXML(); [duplicate]

The title pretty much says it all.

If I have something like (from PHP site examples):

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<movies></movies>
XML;

$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("<pre>".htmlspecialchars($sxe->asXML())."</pre>");

die();

I end up outputing a long string like so:

<?xml version="1.0" standalone="yes"?>
<movies type="documentary"><movie><title>PHP2: More Parser Stories</title><plot>This is all about the people who make it work.</plot><characters><character><name>Mr. Parser</name><actor>John Doe</actor></character></characters><rating type="stars">5</rating></movie></movies>

This is fine for a program consumer, but for debugging/human tasks, does anyone know how to get this into a nice indented format?

like image 917
Eli Avatar asked Jul 27 '09 23:07

Eli


3 Answers

There's a variety of solutions in the comments on the PHP manual page for SimpleXMLElement. Not very efficient, but certainly terse, is a solution by Anonymous

$dom = dom_import_simplexml($simpleXml)->ownerDocument;
$dom->formatOutput = true;
echo $dom->saveXML();

The PHP manual page comments are often good sources for common needs, as long as you filter out the patently wrong stuff first.

like image 137
Adam Wright Avatar answered Nov 20 '22 11:11

Adam Wright


The above didn't work for me, I found this worked:

$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simpleXml->asXML());
echo $dom->saveXML();
like image 21
Bidders Avatar answered Nov 20 '22 11:11

Bidders


Found a similar solution...to format raw xlm data..from my php SOAP requests __getLastRequest & __getLastResponse, for quick debugging the xml's i have combined it with google-code-prettify.

Its a good solution if you want to format sensitive xml data and don't want to do it online.

Some sample code below, may be helpful to others:

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($data); //=====$data has the raw xml data...you want to format

echo '<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>';

echo "<br/> <pre class=\"prettyprint\" >". htmlentities($dom->saveXML())."</pre>";

Below is a sample of the Formatted XML Output I got:

Note: The formatted XML is available in $dom->saveXML() and can be directly saved to a xml file using php file write.

Formatted XML Output

like image 8
naxrohan Avatar answered Nov 20 '22 13:11

naxrohan