본문 바로가기

php xml parse 3종 세트

반응형

<?php

    class Xml
    {
        var $data;
        var $encoding;
        var $arr;
        var $pointer;
        var $index;

        //$path            : 파일경로
        //$filename        : 파일명
        //$encoding        : UTF-8
        function xmlInit($filename, $encoding)
        {
            $fp = @fsockopen($filename, 80);

            if (!$fp)
            {
                die("XML : {$filename} 을 열수 없습니다.");
            }
            else
            {

                while (!feof($fp)) {
                    $data .= fgets ($fp,128);
                }
                fclose ($fp);

            }

            $this->encoding = $encoding;
            $this->data     = $data;
        }

        function xmlData()
        {
            $this->index = 0;
            $this->pointer[] = &$this->arr;

            $xml_parser = xml_parser_create($this->encoding);

            xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
            xml_set_object($xml_parser, &$this);
            xml_set_element_handler($xml_parser, "startElement", "endElement");
            xml_set_character_data_handler($xml_parser, "characterData");

            xml_parse($xml_parser, $this->data, true );
            xml_parser_free($xml_parser);
        }

        function startElement($parser, $tag, $attribute)
        {
            foreach($attribute as $name => $value)
            {
                $value = $this->cleanString($value);
                $object->$name = $value;
            }
            eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;");
            eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . ");" );
            eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" );

            $this->index++;
        }

        function endElement($parser, $tag)
        {
            array_pop($this->pointer);
            $this->index--;
        }

        function characterData($parser, $data)
        {
            if(trim($data)) $this->pointer[$this->index] = trim($data);
        }

        function cleanString($string)
        {
            return utf8_decode(trim($string));
        }
    }

?>



< ?php

    class Xml
    {
      var $tag;
      var $value;
      var $attributes;
      var $next;
    }

    function xml2array($xml_string)
    {
      $Parser = xml_parser_create();
      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, $xml_string, $Xml_Values);
      xml_parser_free($Parser);
      $XmlClass = array();
      $LastObj = array();
      $NowObj = &$XmlClass;

      foreach($Xml_Values as $Xml_Key => $Xml_Value)
      {
          $Index = count($NowObj);
          if($Xml_Value["type"] == "complete")
          {
              $NowObj[$Index] = new Xml;
              $NowObj[$Index]->tag = $Xml_Value["tag"];
              $NowObj[$Index]->value = $Xml_Value["value"];
              $NowObj[$Index]->attributes = $Xml_Value["attributes"];
          }
          elseif($Xml_Value["type"] == "open")
          {
              $NowObj[$Index] = new Xml;
              $NowObj[$Index]->tag = $Xml_Value["tag"];
              $NowObj[$Index]->value = $Xml_Value["value"];
              $NowObj[$Index]->attributes = $Xml_Value["attributes"];
              $NowObj[$Index]->next = array();
              $LastObj[count($LastObj)] = &$NowObj;
              $NowObj = &$NowObj[$Index]->next;
          }
          elseif($Xml_Value["type"] == "close")
          {
              $NowObj = &$LastObj[count($LastObj) - 1];
              unset($LastObj[count($LastObj) - 1]);
          }

      }

      return $XmlClass;
    }

?>




< ?php

    class xmlParse
    {
       var $node = array();
       var $xmlParser;
       var $result;
       var $temp;
       var $cou_node;

       function xmlParse($data,$type=1)
       {
          // Unset variable
          unset($this->xmlParser);
          unset($this->result);

          // Create XML Parser
          $this->xmlParser = xml_parser_create();

          // Set handler
          xml_set_object($this->xmlParser,&$this);
          xml_set_element_handler($this->xmlParser, "startElement", "endElement");
          xml_set_character_data_handler($this->xmlParser, "characterData");

          // File
          if($type==2)
          {
             if(!($temp = file($data)))
             {
                die("could not open XML input");
             }
             $fdata = join('',$temp);
             $fdata = str_replace("\n",'',$fdata);
             $fdata = str_replace("\r",'',$fdata);
             $fdata = str_replace("    ",'',$fdata);
             $fdata = trim($fdata);

             if(!xml_parse($this->xmlParser,$fdata)) return 0;

          // Variable
          } elseif($type==1)
          {
             // Parsing
             if(!xml_parse($this->xmlParser,$data)) return 0;
          }
       }

       // Return
       function ret()
       {
          // return Array
          return $this->result;
       }

       /////////////////////////////////////////////////////////////////////////////
       // private
       /////////////////////////////////////////////////////////////////////////////
       function startElement($parser, $name, $attribs)
       {
          // Add node, Clear TEMP
          array_push($this->node, $name);
          unset($this->temp);

          // Count nodes
          $count = count($this->node);
          $this->{'cou_'.$count.'_'.$this->node[$count-1]}++;

          // Create String What is for Eval
          for($i=0;$i<$count;$i++)
          {
             $this->temp.='[\''.$this->node[$i].'\']['.$this->{'cou_'.($i+1).'_'.$this->node[$i]}.']';
          }

          $string = $this->temp;
          eval('$this->result'.$string.'="";');

          if (count($attribs)) {
               while (list($k, $v) = each($attribs)) {
                eval('$this->result'.$string.'[\''.$k.'\']="'.$v.'";');
             }
          }
       }

       // private
       function endElement($parser, $name)
       {
          $count = count($this->node);
          $count++;
          $this->{'cou_'.$count.'_'.$this->node[$count]} = 0;

          unset($this->temp);
          array_pop($this->node);
       }

       // private
       function characterData($parser, $data)
       {
          $string = $this->temp;
          eval('$this->result'.$string.'="'.$data.'";');
       }
    }

?>

반응형

댓글


Copyright ⓒ SmartWeb All rights reserved.