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="\n\n";
         $xml.= "zhangsan\n";
         $xml.= "man\n";
         $xml.="

";
             $xml.="China\n";
             $xml.="Beijing\n";
         $xml.="
\n";
         $xml.= "2\n";
          $xml.= "\n\n";

 $sfd=xml2array($xml);//调用上面的转换函数进行转换
 print_r($sfd);//把转换后生成的数组打印出来


  打印结果:

 Array
  (
    [document] => Array
        (
            [name] => zhangsan
            [sex] => man
            [address] => Array
                (
                    [country] => China
                    [province] => Beijing
                )

            [status] => 2
        )

)

你可能感兴趣的:(PHP)