| Subcribe via RSS

xml 2 array and array to xml

May 12th, 2008 | No Comments | 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

Tags: , , ,