PHP XML转数组函数

PHP代码
  1. <?  
  2. /** 
  3.  
  4. xml2array() will convert the given XML text to an array in the XML structure. 
  5. * Link: http://www.bin-co.com/php/scripts/xml2array/ 
  6. * Arguments : $contents - The XML text 
  7. *                  $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. 
  8. *                  $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. 
  9. * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. 
  10. * Examples: $array =    xml2array(file_get_contents('feed.xml')); 
  11. *                $array =    xml2array(file_get_contents('feed.xml', 1, 'attribute')); 
  12. */  
  13. function xml2array($contents$get_attributes=1, $priority = 'tag') {  
  14.       if(!$contentsreturn array();  
  15.   
  16.       if(!function_exists('xml_parser_create')) {  
  17.         //print "'xml_parser_create()' function not found!";  
  18.         return array();  
  19.       }  
  20.   
  21.     //Get the XML parser of PHP - PHP must have this module for the parser to work  
  22.     $parser = xml_parser_create('');  
  23.     xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss  
  24.     xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);  
  25.     xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);  
  26.     xml_parse_into_struct($parser, trim($contents), $xml_values);  
  27.     xml_parser_free($parser);  
  28.   
  29.       if(!$xml_valuesreturn;//Hmm...  
  30.   
  31.       //Initializations  
  32.     $xml_array = array();  
  33.     $parents = array();  
  34.     $opened_tags = array();  
  35.     $arr = array();  
  36.   
  37.     $current = &$xml_array//Refference  
  38.   
  39.       //Go through the tags.  
  40.     $repeated_tag_index = array();//Multiple tags with same name will be turned into an array  
  41.     foreach($xml_values as $data) {  
  42.           unset($attributes,$value);//Remove existing values, or there will be trouble  
  43.   
  44.           //This command will extract these variables into the foreach scope  
  45.           // tag(string), type(string), level(int), attributes(array).  
  46.         extract($data);//We could use the array by itself, but this cooler.  
  47.   
  48.         $result = array();  
  49.         $attributes_data = array();  
  50.            
  51.           if(isset($value)) {  
  52.               if($priority == 'tag'$result = $value;  
  53.               else $result['value'] = $value//Put the value in a assoc array if we are in the 'Attribute' mode  
  54.         }  
  55.   
  56.         //Set the attributes too.  
  57.         if(isset($attributesand $get_attributes) {  
  58.               foreach($attributes as $attr => $val) {  
  59.                   if($priority == 'tag'$attributes_data[$attr] = $val;  
  60.                   else $result['attr'][$attr] = $val//Set all the attributes in a array called 'attr'  
  61.             }  
  62.           }  
  63.   
  64.         //See tag status and do the needed.  
  65.         if($type == "open") {//The starting of the tag '<tag>'  
  66.             $parent[$level-1] = &$current;  
  67.               if(!is_array($currentor (!in_array($tagarray_keys($current)))) { //Insert New tag  
  68.                 $current[$tag] = $result;  
  69.                   if($attributes_data$current[$tag'_attr'] = $attributes_data;  
  70.                 $repeated_tag_index[$tag.'_'.$level] = 1;  
  71.   
  72.                 $current = &$current[$tag];  
  73.   
  74.               } else { //There was another element with the same tag name  
  75.   
  76.                 if(isset($current[$tag][0])) {//If there is a 0th element it is already an array  
  77.                     $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;  
  78.                     $repeated_tag_index[$tag.'_'.$level]++;  
  79.                   } else {//This section will make the value an array if multiple tags with the same name appear together  
  80.                     $current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array  
  81.                     $repeated_tag_index[$tag.'_'.$level] = 2;  
  82.                        
  83.                       if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well  
  84.                         $current[$tag]['0_attr'] = $current[$tag.'_attr'];  
  85.                           unset($current[$tag.'_attr']);  
  86.                       }  
  87.   
  88.                   }  
  89.                 $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;  
  90.                 $current = &$current[$tag][$last_item_index];  
  91.               }  
  92.   
  93.           } elseif($type == "complete") { //Tags that ends in 1 line '<tag />'  
  94.               //See if the key is already taken.  
  95.             if(!isset($current[$tag])) { //New Key  
  96.                 $current[$tag] = $result;  
  97.                 $repeated_tag_index[$tag.'_'.$level] = 1;  
  98.                   if($priority == 'tag' and $attributes_data$current[$tag'_attr'] = $attributes_data;  
  99.   
  100.               } else { //If taken, put all things inside a list(array)  
  101.                 if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array...  
  102.   
  103.                       // ...push the new element into that array.  
  104.                     $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;  
  105.                        
  106.                       if($priority == 'tag' and $get_attributes and $attributes_data) {  
  107.                         $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;  
  108.                       }  
  109.                     $repeated_tag_index[$tag.'_'.$level]++;  
  110.   
  111.                   } else { //If it is not an array...  
  112.                     $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value  
  113.                     $repeated_tag_index[$tag.'_'.$level] = 1;  
  114.                       if($priority == 'tag' and $get_attributes) {  
  115.                           if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well  
  116.                                
  117.                             $current[$tag]['0_attr'] = $current[$tag.'_attr'];  
  118.                               unset($current[$tag.'_attr']);  
  119.                           }  
  120.                            
  121.                           if($attributes_data) {  
  122.                             $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;  
  123.                           }  
  124.                       }  
  125.                     $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken  
  126.                 }  
  127.               }  
  128.   
  129.           } elseif($type == 'close') { //End of tag '</tag>'  
  130.             $current = &$parent[$level-1];  
  131.           }  
  132.       }  
  133.        
  134.       return($xml_array);  
  135. }  
  136. ?>   

Tags: xml

上一篇: 求职必查网站之公司注册信息   下一篇: PHP也做socket编程

你问我答

  1. #1 头像 jayle 2011-08-23 12:02:58
    好用!谢谢

提交疑问

回顶部