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.
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])) {
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;
}
function _del_p(&$ary) {
foreach ($ary as $k=>$v) {
if ($k===‘_p’) unset($ary[$k]);
elseif (is_array($ary[$k])) _del_p($ary[$k]);
}
}
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);
}
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:
array to xml,
function,
php,
xml to array