php中把一个xml文件转换为数组

我们在做接口时,很多情况下都用的是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
        )

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值