TIP게시판

제목 전에 xmlToArray가 쓰기 불편해서 이걸로 변경했어요.
글쓴이 양승현 작성시각 2011/04/01 16:27:55
댓글 : 0 추천 : 0 스크랩 : 0 조회수 : 13162   RSS
 /**
  * xml을 array로 변형하여 리턴
  *
  * @param String $__url xml파일 경로 및 파일명
  * @return Array $xml_array 변형된 배열
  */
 function my_xml2array($__url)
 {
     $xml_values = array();
     $contents = file_get_contents($__url);
     $parser = xml_parser_create('');
     if(!$parser)
         return false;
 
     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 array();
   
     $xml_array = array();
     $last_tag_ar =& $xml_array;
     $parents = array();
     $last_counter_in_tag = array(1=>0);
     foreach ($xml_values as $data)
     {
         switch($data['type'])
         {
             case 'open':
                 $last_counter_in_tag[$data['level']+1] = 0;
                 $new_tag = array('name' => $data['tag']);
                 if(isset($data['attributes']))
                     $new_tag['attributes'] = $data['attributes'];
                 if(isset($data['value']) && trim($data['value']))
                     $new_tag['value'] = trim($data['value']);
                 $last_tag_ar[$last_counter_in_tag[$data['level']]] = $new_tag;
                 $parents[$data['level']] =& $last_tag_ar;
                 $last_tag_ar =& $last_tag_ar[$last_counter_in_tag[$data['level']]++];
                 break;
             case 'complete':
                 $new_tag = array('name' => $data['tag']);
                 if(isset($data['attributes']))
                     $new_tag['attributes'] = $data['attributes'];
                 if(isset($data['value']) && trim($data['value']))
                     $new_tag['value'] = trim($data['value']);
 
                 $last_count = count($last_tag_ar)-1;
                 $last_tag_ar[$last_counter_in_tag[$data['level']]++] = $new_tag;
                 break;
             case 'close':
                 $last_tag_ar =& $parents[$data['level']];
                 break;
             default:
                 break;
         };
     }
     return $xml_array;
 }
 
 function get_value_by_path($__xml_tree, $__tag_path)
 {
     $tmp_arr =& $__xml_tree;
     $tag_path = explode('/', $__tag_path);
     foreach($tag_path as $tag_name)
     {
         $res = false;
         foreach($tmp_arr as $key => $node)
         {
             if(is_int($key) && $node['name'] == $tag_name)
             {
                 $tmp_arr = $node;
                 $res = true;
                 break;
             }
         }
         if(!$res)
             return false;
     }
     return $tmp_arr;
 }
 다음글 Microsoft SQL Server 2000 pagi... (1)
 이전글 디렉토리 퍼미션변경, 디렉토리 삭제, 통체로 복사 등등... (1)

댓글

없음