我们在做接口时,很多情况下都用的是xml进行数据传送,比如多个系统间的数据传送或者不同语言间的数据传送等等,但是我们在请求接口后接受到返回的xml数据后都要加以解析处理,然后使用。下面是一个把接受到的xml格式数据文件解析成一个数组的函数。
转换函数:
function xml2array($contents, $get_attributes=1, $priority = 'tag') {
if(!$contents) return array();
if(!function_exists('xml_parser_create')) {//检查php系统函数
return array();
}
$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, trim($contents), $xml_values);
xml_parser_free($parser);
if(!$xml_values) return;
$xml_array = array();
$parents = array();
$opened_tags = array();
$arr = array();
$current = &$xml_array;
$repeated_tag_index = array();
foreach($xml_values as $data) {
unset($attributes,$value);
extract($data);
$result = array();
$attributes_data = array();
if(isset($value)) {
if($priority == 'tag') $result = $value;
else $result['value'] = $value;
}
if(isset($attributes) and $get_attributes) {
foreach($attributes as $attr => $val) {
if($priority == 'tag') $attributes_data[$attr] = $val;
else $result['attr'][$attr] = $val;
}
}
if($type == "open") {
$parent[$level-1] = &$current;
if(!is_array($current) or (!in_array($tag, array_keys($current)))) {
$current[$tag] = $result;
if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
$repeated_tag_index[$tag.'_'.$level] = 1;
$current = &$current[$tag];
} else {
if(isset($current[$tag][0])) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
$repeated_tag_index[$tag.'_'.$level]++;
} else {
$current[$tag] = array($current[$tag],$result);
$repeated_tag_index[$tag.'_'.$level] = 2;
if(isset($current[$tag.'_attr'])) {
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
}
}
$last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
$current = &$current[$tag][$last_item_index];
}
} elseif($type == "complete") {
if(!isset($current[$tag])) {
$current[$tag] = $result;
$repeated_tag_index[$tag.'_'.$level] = 1;
if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;
} else {
if(isset($current[$tag][0]) and is_array($current[$tag])) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
if($priority == 'tag' and $get_attributes and $attributes_data) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
}
$repeated_tag_index[$tag.'_'.$level]++;
} else {
$current[$tag] = array($current[$tag],$result);
$repeated_tag_index[$tag.'_'.$level] = 1;
if($priority == 'tag' and $get_attributes) {
if(isset($current[$tag.'_attr'])) {
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
}
if($attributes_data) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
}
}
$repeated_tag_index[$tag.'_'.$level]++;
}
}
} elseif($type == 'close') {
$current = &$parent[$level-1];
}
}
return($xml_array);
}
测试转换函数(先生成一个xml文件):
$xml="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<document>\n";
$xml.= "<name>zhangsan</name>\n";
$xml.= "<sex>man</sex>\n";
$xml.="<address>";
$xml.="<country>China</country>\n";
$xml.="<province>Beijing</province>\n";
$xml.="</address>\n";
$xml.= "<status>2</status>\n";
$xml.= "\n</document>\n";
$sfd=xml2array($xml);//调用上面的转换函数进行转换
print_r($sfd);//把转换后生成的数组打印出来
打印结果:
Array
(
[document] => Array
(
[name] => zhangsan
[sex] => man
[address] => Array
(
[country] => China
[province] => Beijing
)
[status] => 2
)
)