xml 2 array and array to xml
May 12th, 2008 Posted in php by dreamluverz
I’ve tried this function with google feed but doesn’t seem to work. I haven’t look into details of it yet anyways you can try it and give it a shot. You can also use this for array to xml. Just check the link of the original post for more info.
PHP: XML to Array and backwards
Here the XML with PHP solution: XML->Array and Array->XML.
Work with it as with usual array.
Format XML->Array
_c - children
_v - value
_a - attributes
This is 1.1
Example #1 (1.xml):
<ddd> <onemore dd="55"> <tt>333</tt> <tt ss="s1">555</tt> <tt>777</tt> </onemore> <two>sdf rr</two> </ddd>
The code:
$xml=xml2ary(file_get_contents('1.xml')); print_r($xml);
Here is the Array result:
Array ( [ddd] => Array ( [_c] => Array ( [onemore] => Array ( [_a] => Array ( [dd] => 55 ) [_c] => Array ( [tt] => Array ( [0] => Array ( [_v] => 333 ) [1] => Array ( [_a] => Array ( [ss] => s1 ) [_v] => 555 ) [2] => Array ( [_v] => 777 ) ) ) ) [two] => Array ( [_v] => sdf rr ) ) ) )
function xml2ary(&$string) { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parse_into_struct($parser, $string, $vals, $index); xml_parser_free($parser); $mnary=array(); $ary=&$mnary; foreach ($vals as $r) { $t=$r['tag']; if ($r['type']=='open') { if (isset($ary[$t])) { if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_c']=array(); $cv['_c']['_p']=&$ary; $ary=&$cv['_c']; } elseif ($r['type']=='complete') { if (isset($ary[$t])) { // same as open if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_v']=(isset($r['value']) ? $r['value'] : ''); } elseif ($r['type']=='close') { $ary=&$ary['_p']; } } _del_p($mnary); return $mnary; } // _Internal: Remove recursion in result array function _del_p(&$ary) { foreach ($ary as $k=>$v) { if ($k==='_p') unset($ary[$k]); elseif (is_array($ary[$k])) _del_p($ary[$k]); } } // Array to XML function ary2xml($cary, $d=0, $forcetag='') { $res=array(); foreach ($cary as $tag=>$r) { if (isset($r[0])) { $res[]=ary2xml($r, $d, $tag); } else { if ($forcetag) $tag=$forcetag; $sp=str_repeat("\t", $d); $res[]="$sp<$tag"; if (isset($r['_a'])) {foreach ($r['_a'] as $at=>$av) $res[]=" $at=\"$av\"";} $res[]=">".((isset($r['_c'])) ? "\n" : ''); if (isset($r['_c'])) $res[]=ary2xml($r['_c'], $d+1); elseif (isset($r['_v'])) $res[]=$r['_v']; $res[]=(isset($r['_c']) ? $sp : '')."</$tag>\n"; } } return implode('', $res); } // Insert element into array function ins2ary(&$ary, $element, $pos) { $ar1=array_slice($ary, 0, $pos); $ar1[]=$element; $ary=array_merge($ar1, array_slice($ary, $pos)); }
source: http://mysrc.blogspot.com/2007/02/php-xml-to-array-and-backwards.html



