개발자의 팩션골드의 지식베이스 입니다.


  1. 배열을 이용한 방법

    함수
     {
      $contents = "";
      if(!function_exists('xml_parser_create'))
       return array ();
      $parser = xml_parser_create('');
      if(!($fp = @ fopen($url, 'rb')))
       return array ();
      while (!feof($fp))
      {
       $contents .= fread($fp, 8192);
      }
      fclose($fp);
      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; //Set all the attributes in a array called 'attr'
        }
       }
       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]++; //0 and 1 index is already taken
         }
        }
       }
       elseif($type == 'close')
        $current = & $parent[$level -1];
      }
      return ($xml_array);
    출력
    $xmlC= xml2array("price.xml");
    pprint($xmlC);
  2. 클래스를 이용한 방법

    클래스
    {
     var $arrOutput = array();
     var $resParser;
     var $strXmlData;
     function xml2Class($url)
     {
      $this->resParser = xml_parser_create ();
      xml_set_object($this->resParser,$this);
      xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");
      xml_set_character_data_handler($this->resParser, "tagData");
      $strInputXML = file_get_contents($url);
      $this->strXmlData = xml_parse($this->resParser,$strInputXML);
      if(!$this->strXmlData){
       die(sprintf("XML error: %s at line %d",
       xml_error_string(xml_get_error_code($this->resParser)),
       xml_get_current_line_number($this->resParser)));
      }
      xml_parser_free($this->resParser);
      unset($this->resParser, $this->strXmlData);
      return $this->arrOutput;
     }
     function tagOpen($parser, $name, $attrs)
     {
      $tag=array("name"=>$name,"attrs"=>$attrs);
      array_push($this->arrOutput,$tag);
     }
     function tagData($parser, $tagData)
     {
      if(trim($tagData)){
       if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData']))
        $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
       else
        $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
      }
     }
     function tagClosed($parser, $name)
     {
      $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
      array_pop($this->arrOutput);
     }
    }
    출력
    $xmlC = new xml2Class($filename);
    pprint($xmlC);

 

Comment +0