php - How to convert array to SimpleXML

ID : 10253

viewed : 16

Tags : phpxmlarrayssimplexml

Top 5 Answer for php - How to convert array to SimpleXML

vote vote

97

Here is php 5.2 code which will convert array of any depth to xml document:

Array (     ['total_stud']=> 500     [0] => Array         (             [student] => Array                 (                     [id] => 1                     [name] => abc                     [address] => Array                         (                             [city]=>Pune                             [zip]=>411006                         )                                        )         )     [1] => Array         (             [student] => Array                 (                     [id] => 2                     [name] => xyz                     [address] => Array                         (                             [city]=>Mumbai                             [zip]=>400906                         )                    )          ) ) 

generated XML would be as:

<?xml version="1.0"?> <student_info>     <total_stud>500</total_stud>     <student>         <id>1</id>         <name>abc</name>         <address>             <city>Pune</city>             <zip>411006</zip>         </address>     </student>     <student>         <id>1</id>         <name>abc</name>         <address>             <city>Mumbai</city>             <zip>400906</zip>         </address>     </student> </student_info> 

PHP snippet

<?php // function defination to convert array to xml function array_to_xml( $data, &$xml_data ) {     foreach( $data as $key => $value ) {         if( is_array($value) ) {             if( is_numeric($key) ){                 $key = 'item'.$key; //dealing with <0/>..<n/> issues             }             $subnode = $xml_data->addChild($key);             array_to_xml($value, $subnode);         } else {             $xml_data->addChild("$key",htmlspecialchars("$value"));         }      } }  // initializing or creating array $data = array('total_stud' => 500);  // creating object of SimpleXMLElement $xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>');  // function call to convert array to xml array_to_xml($data,$xml_data);  //saving generated xml file;  $result = $xml_data->asXML('/file/path/name.xml');  ?> 

Documentation on SimpleXMLElement::asXML used in this snippet

vote vote

82

a short one:

<?php  $test_array = array (   'bla' => 'blub',   'foo' => 'bar',   'another_array' => array (     'stack' => 'overflow',   ), ); $xml = new SimpleXMLElement('<root/>'); array_walk_recursive($test_array, array ($xml, 'addChild')); print $xml->asXML(); 

results in

<?xml version="1.0"?> <root>   <blub>bla</blub>   <bar>foo</bar>   <overflow>stack</overflow> </root> 

keys and values are swapped - you could fix that with array_flip() before the array_walk. array_walk_recursive requires PHP 5. you could use array_walk instead, but you won't get 'stack' => 'overflow' in the xml then.

vote vote

76

The answers provided here only convert array to XML with nodes, you are not able to set attributes. I have written a php function that allows you to convert an array to php and also set attributes for particular nodes in the xml. The downside here is you have to construct an array in a particular way with few conventions (only if you want to use attributes)

The following example will allow you to set attributes in XML too.

The source can be found here: https://github.com/digitickets/lalit/blob/master/src/Array2XML.php

<?php     $books = array(     '@attributes' => array(         'type' => 'fiction'     ),     'book' => array(         array(             '@attributes' => array(                 'author' => 'George Orwell'             ),             'title' => '1984'         ),         array(             '@attributes' => array(                 'author' => 'Isaac Asimov'             ),             'title' => 'Foundation',             'price' => '$15.61'         ),         array(             '@attributes' => array(                 'author' => 'Robert A Heinlein'             ),             'title' => 'Stranger in a Strange Land',             'price' => array(                 '@attributes' => array(                     'discount' => '10%'                 ),                 '@value' => '$18.00'             )         )     ) ); /* creates  <books type="fiction">   <book author="George Orwell">     <title>1984</title>   </book>   <book author="Isaac Asimov">     <title>Foundation</title>     <price>$15.61</price>   </book>   <book author="Robert A Heinlein">     <title>Stranger in a Strange Land</title>     <price discount="10%">$18.00</price>   </book> </books> */ ?> 
vote vote

70

I found all of the answers to use too much code. Here is an easy way to do it:

function to_xml(SimpleXMLElement $object, array $data) {        foreach ($data as $key => $value) {         if (is_array($value)) {             $new_object = $object->addChild($key);             to_xml($new_object, $value);         } else {             // if the key is an integer, it needs text with it to actually work.             if ($key != 0 && $key == (int) $key) {                 $key = "key_$key";             }              $object->addChild($key, $value);         }        }    }    

Then it's a simple matter of sending the array into the function, which uses recursion, so it will handle a multi-dimensional array:

$xml = new SimpleXMLElement('<rootTag/>'); to_xml($xml, $my_array); 

Now $xml contains a beautiful XML object based on your array exactly how you wrote it.

print $xml->asXML(); 
vote vote

58

 <?php function array_to_xml(array $arr, SimpleXMLElement $xml) {     foreach ($arr as $k => $v) {         is_array($v)             ? array_to_xml($v, $xml->addChild($k))             : $xml->addChild($k, $v);     }     return $xml; }  $test_array = array (     'bla' => 'blub',     'foo' => 'bar',     'another_array' => array (         'stack' => 'overflow',     ), );  echo array_to_xml($test_array, new SimpleXMLElement('<root/>'))->asXML(); 

Top 3 video Explaining php - How to convert array to SimpleXML

Related QUESTION?