1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Klasse erzeugen

  • Ordovicium
  • 18. Mai 2006 um 01:07
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Ordovicium
    Punkte
    3.693
    Artikel
    13
    Beiträge
    569
    • 18. Mai 2006 um 01:07
    • #1

    Ich schaffe es einfach nicht aus folgendem eine Klasse zu erzeugen:
    Ich möchte der Klasse schlussendlich nur noch die URL übergeben.

    PHP
    <?php 
    $file = "http://www.informatik-forum.at/external.php?type=XML";
    $stack = array();
    
    
    // start_element_handler ( resource parser, string name, array attribs )
    function startElement($parser, $name, $attribs)
    {
       global $stack;
       $tag=array("name"=>$name,"attrs"=>$attrs);
       array_push($stack,$tag);
    }
    
    
    // end_element_handler ( resource parser, string name )
    function endElement($parser, $name)
    {
       global $stack;
       $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
       array_pop($stack);
    }
    
    
    // handler ( resource parser, string data )
    function characterData($parser, $data)
    {
       global $stack,$i;
    
    
       if(trim($data))
       { 
                 $stack[count($stack)-1]['data'] .= $data; 
       }
    }
    
    
    // handler ( resource parser, string target, string data )
    function PIHandler($parser, $target, $data)
    {
    global $stack,$i;
    //PHP EVALUATION
       if ((strtolower($target)) == "php") {
               global $parser_file;
             //eval($data);  gust doesn't work if you want the
             //string added to the array
             $text .= '<?php '.$data.' ?>'; 
             ob_start();
               eval ('?>' . $text);
               $text = ob_get_clean();
               $stack[count($stack)-1]['data'] .= $text;
    
       }
    
    }
    
    
    function defaultHandler($parser, $data)
    {
    
    }
    
    
    function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                     $publicId) {
       if ($systemId) {
           if (!list($parser, $fp) = new_xml_parser($systemId)) {
               printf("Could not open entity %s at %s\n", $openEntityNames,
                       $systemId);
               return false;
           }
           while ($data = fread($fp, 4096)) {
               if (!xml_parse($parser, $data, feof($fp))) {
                   printf("XML error: %s at line %d while parsing entity %s\n",
                           xml_error_string(xml_get_error_code($parser)),
                           xml_get_current_line_number($parser), $openEntityNames);
                   xml_parser_free($parser);
                   return false;
               }
           }
           xml_parser_free($parser);
           return true;
       }
       return false;
    }
    
    
    function new_xml_parser($file)
    {
       global $parser_file;
       $xml_parser = xml_parser_create();
    
       xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    
       xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    
       xml_set_element_handler($xml_parser, "startElement", "endElement");
    
       xml_set_character_data_handler($xml_parser, "characterData");
    
       xml_set_default_handler($xml_parser, "defaultHandler");
    
       xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
     
       if (!($fp = @fopen($file, "r"))) {
           return false;
       }
       if (!is_array($parser_file)) {
           settype($parser_file, "array");
       }
       $parser_file[$xml_parser] = $file;
       return array($xml_parser, $fp);
    }
    
    
    if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
       die("could not open XML input");
    }
    
    
    //ERROR
    while ($data = fread($fp, 4096)) {
       if (!xml_parse($xml_parser, $data, feof($fp))) {
           die(sprintf("XML error: %s at line %d\n",
                       xml_error_string(xml_get_error_code($xml_parser)),
                       xml_get_current_line_number($xml_parser)));
       }
    }
    //END
    xml_parser_free($xml_parser);
    print_r($stack); 
    ?>
    Alles anzeigen
  • anty
    Punkte
    177
    Beiträge
    31
    • 18. Mai 2006 um 15:03
    • #2

    Ich habs nicht getestet, aber ich denke das sollte dir zumindest ungefähr zeigen wie das ganze aussehen soll.

    PHP
    <?php
    class classname {
        var $file = "http://www.informatik-forum.at/external.php?type=XML";
        var $stack = array();
    
        // construct, muss den gleichen namen haben wie die class
        function classname($file) {
            $this->file = $file;
        }
    
        // start_element_handler ( resource parser, string name, array attribs )
        function startElement($parser, $name, $attribs)
        {
           global $this->stack;
           $tag=array("name"=>$name,"attrs"=>$attrs);
           array_push($this->stack,$tag);
        }
    
        // end_element_handler ( resource parser, string name )
        function endElement($parser, $name)
        {
           global $this->stack;
           $this->stack[count($this->stack)-2]['children'][] = $this->stack[count($this->stack)-1];
           array_pop($this->stack);
        }
    
        // handler ( resource parser, string data )
        function characterData($parser, $data)
        {
           global $this->stack,$i;
    
    
           if(trim($data))
           {
                     $this->stack[count($this->stack)-1]['data'] .= $data;
           }
        }
    
        // handler ( resource parser, string target, string data )
        function PIHandler($parser, $target, $data)
        {
        global $this->stack,$i;
        //PHP EVALUATION
           if ((strtolower($target)) == "php") {
                   global $parser_file;
                 //eval($data);  gust doesn't work if you want the
                 //string added to the array
                 $text .= '<?php '.$data.' ?>';
                 ob_start();
                   eval ('?>' . $text);
                   $text = ob_get_clean();
                   $this->stack[count($this->stack)-1]['data'] .= $text;
    
           }
    
        }
    
        function defaultHandler($parser, $data)
        {
    
        }
    
        function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                         $publicId) {
           if ($systemId) {
               if (!list($parser, $fp) = new_xml_parser($systemId)) {
                   printf("Could not open entity %s at %s\n", $openEntityNames,
                           $systemId);
                   return false;
               }
               while ($data = fread($fp, 4096)) {
                   if (!xml_parse($parser, $data, feof($fp))) {
                       printf("XML error: %s at line %d while parsing entity %s\n",
                               xml_error_string(xml_get_error_code($parser)),
                               xml_get_current_line_number($parser), $openEntityNames);
                       xml_parser_free($parser);
                       return false;
                   }
               }
               xml_parser_free($parser);
               return true;
           }
           return false;
        }
    
        function new_xml_parser($this->file)
        {
           global $parser_file;
           $xml_parser = xml_parser_create();
    
           xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    
           xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    
           xml_set_element_handler($xml_parser, "startElement", "endElement");
    
           xml_set_character_data_handler($xml_parser, "characterData");
    
           xml_set_default_handler($xml_parser, "defaultHandler");
    
           xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
    
           if (!($fp = @fopen($this->file, "r"))) {
               return false;
           }
           if (!is_array($parser_file)) {
               settype($parser_file, "array");
           }
           $parser_file[$xml_parser] = $this->file;
           return array($xml_parser, $fp);
        }
    
        if (!(list($xml_parser, $fp) = new_xml_parser($this->file))) {
           die("could not open XML input");
        }
    
        //ERROR
        while ($data = fread($fp, 4096)) {
           if (!xml_parse($xml_parser, $data, feof($fp))) {
               die(sprintf("XML error: %s at line %d\n",
                           xml_error_string(xml_get_error_code($xml_parser)),
                           xml_get_current_line_number($xml_parser)));
           }
        }
        //END
        xml_parser_free($xml_parser);
        print_r($this->stack);
    }
    ?>
    Alles anzeigen


    die "global"s würde ich übrigens durch $this-> ersetzen...

  • davewood
    Punkte
    3.204
    Beiträge
    536
    • 18. Mai 2006 um 17:39
    • #3

    ab php 5 sollte man für den constructor

    public function __construct()

    verwenden und nicht mehr den klassennamen, frag mich jetzt nicht wieso.
    nachlesen auf php.net

  • Ordovicium
    Punkte
    3.693
    Artikel
    13
    Beiträge
    569
    • 19. Mai 2006 um 00:21
    • #4
    Code
    [B]Fatal error[/B]:  Cannot re-assign $this in [B]D:\apachefriends\xampp\htdocs\teko\public_html\class\xmlparser.php[/B] on line [B]14[/B]


    Zeile 14:
    global $this->stack;

    Aber wie gesagt mein Ziel wäre es der Klasse/Funktion eine Adresse zu liefern und ein array mit den Infos zurück zu bekommen.

    PHP
    <?php 
    include('class/xmlparser.php');
    $p = new xmlparser();
    $stack = $p->xmlparser("http://www.informatik-forum.at/external.php?type=XML");
    echo "<PRE>";
    print_r($stack);
    echo "</PRE>";
    ?>

    Mein Versuch ging dahin, aus dem letzem Abschnitt (if (!(list($xml_parser, $fp) = new_xml_parser($this->file)))) eine Funktion zu machen und dort den start zu initieren, aber irgendwie will es ned so ganz.

  • Ordovicium
    Punkte
    3.693
    Artikel
    13
    Beiträge
    569
    • 19. Mai 2006 um 01:12
    • #5

    Also bei folgendem bekomme ich lauter fehlermeldungen:

    Klasse:

    PHP
    <?php
    class XMLParser
    {
        var $file;
        var $stack = array();
    
        // start_element_handler ( resource parser, string name, array attribs )
        function startElement($parser, $name, $attribs)
        {
           global $stack;
           $tag=array("name"=>$name,"attrs"=>$attrs);
           array_push($stack,$tag);
        }
    
        // end_element_handler ( resource parser, string name )
        function endElement($parser, $name)
        {
           global $stack;
           $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
           array_pop($stack);
        }
    
        // handler ( resource parser, string data )
        function characterData($parser, $data)
        {
           global $stack,$i;
    
    
           if(trim($data))
           { 
                     $stack[count($stack)-1]['data'] .= $data; 
           }
        }
        // handler ( resource parser, string target, string data )
        function PIHandler($parser, $target, $data)
        {
        global $stack,$i;
        //PHP EVALUATION
           if ((strtolower($target)) == "php") {
                   global $parser_file;
                 //eval($data);  gust doesn't work if you want the
                 //string added to the array
                 $text .= '<?php '.$data.' ?>'; 
                 ob_start();
                   eval ('?>' . $text);
                   $text = ob_get_clean();
                   $stack[count($stack)-1]['data'] .= $text;
    
           }
    
        }
    
        function defaultHandler($parser, $data)
        {
    
        }
    
        function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                         $publicId) {
           if ($systemId) {
               if (!list($parser, $fp) = new_xml_parser($systemId)) {
                   printf("Could not open entity %s at %s\n", $openEntityNames,
                           $systemId);
                   return false;
               }
               while ($data = fread($fp, 4096)) {
                   if (!xml_parse($parser, $data, feof($fp))) {
                       printf("XML error: %s at line %d while parsing entity %s\n",
                               xml_error_string(xml_get_error_code($parser)),
                               xml_get_current_line_number($parser), $openEntityNames);
                       xml_parser_free($parser);
                       return false;
                   }
               }
               xml_parser_free($parser);
               return true;
           }
           return false;
        }
    
        function new_xml_parser($file)
        {
           global $parser_file;
           $xml_parser = xml_parser_create();
    
           xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    
           xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    
           xml_set_element_handler($xml_parser, "startElement", "endElement");
    
           xml_set_character_data_handler($xml_parser, "characterData");
    
           xml_set_default_handler($xml_parser, "defaultHandler");
    
           xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
    
           if (!($fp = @fopen($file, "r"))) {
               return false;
           }
           if (!is_array($parser_file)) {
               settype($parser_file, "array");
           }
           $parser_file[$xml_parser] = $file;
           return array($xml_parser, $fp);
        }
        function NewParse($file)
        {
            if (!(list($xml_parser, $fp) = $this->new_xml_parser($file))) {
               die("could not open XML input");
            }
    
            //ERROR
            while ($data = fread($fp, 4096)) {
               if (!xml_parse($xml_parser, $data, feof($fp))) {
                   die(sprintf("XML error: %s at line %d\n",
                               xml_error_string(xml_get_error_code($xml_parser)),
                               xml_get_current_line_number($xml_parser)));
               }
            }
            //END
            xml_parser_free($xml_parser);
            return $stack;
        }
    }
    ?>
    Alles anzeigen


    Aufruf:

    PHP
    <?
    include("class/xmlparser.php");
    
    
    $p = new XMLParser();
    $stack = $p->NewParse("http://www.informatik-forum.at/external.php?type=XML");
    
    
    print("<pre>\n");
    print_r($stack);
    print("</pre>\n");
    ?>
    Alles anzeigen


    Fehler:

    Code
    [B]Warning[/B]:  xml_parse() [[URL='http://localhost/teko/public_html/function.xml-parse']function.xml-parse[/URL]]: Unable to call handler startElement() in [B]D:\apachefriends\xampp\htdocs\teko\public_html\class\xmlparser.php[/B] on line [B]115[/B]
    
    
    [B]Warning[/B]:  xml_parse() [[URL='http://localhost/teko/public_html/function.xml-parse']function.xml-parse[/URL]]: Unable to call handler characterData() in [B]D:\apachefriends\xampp\htdocs\teko\public_html\class\xmlparser.php[/B] on line [B]115[/B]
    
    
    [B]Warning[/B]:  xml_parse() [[URL='http://localhost/teko/public_html/function.xml-parse']function.xml-parse[/URL]]: Unable to call handler endElement() in [B]D:\apachefriends\xampp\htdocs\teko\public_html\class\xmlparser.php[/B] on line [B]115[/B]

    Und das so oft wie Einträge in der XML sind. Aber wo ruft er die Funktionen auf damit ich mit $this darauf verweisen kann.

  • Paulchen
    Gast
    • 19. Mai 2006 um 11:02
    • #6

    Du brauchst vermutlich in der Methode new_xml_parser vor dem Zuweisen der Handler ein xml_set_object:

    PHP
    xml_set_object($xml_parser, $this);
  • InspectorGadjet
    Punkte
    205
    Beiträge
    39
    • 19. Mai 2006 um 17:19
    • #7

    also mit dem untenstehenden code funktioniert der parser in php5... hoffe er macht dir spass ;) wenn du ihn für php4 brauchst, musst du alle private und public wörter löschen und oben bei den 3 variablen ein var davorschreiben...

    PHP
    <?php
    class XMLParser
    {
    private $file;
    private $stack = array();
    private $parser_file = null;
     
    // start_element_handler ( resource parser, string name, array attribs )
    private function startElement($parser, $name, $attribs)
    {
     
    $tag=array("name"=>$name,"attrs"=>$attribs);
    array_push($this->stack,$tag);
    }
     
    // end_element_handler ( resource parser, string name )
    private function endElement($parser, $name)
    {
     
    $this->stack[count($this->stack)-2]['children'][] = $this->stack[count($this->stack)-1];
    array_pop($this->stack);
    }
     
    // handler ( resource parser, string data )
    private function characterData($parser, $data)
    { 
    if(trim($data))
    { 
    if(isset($this->stack[count($this->stack)-1]['data']))
    {
    $this->stack[count($this->stack)-1]['data'] .= $data; 
    }
    else
    {
    $this->stack[count($this->stack)-1]['data'] = $data;
    }
    }
    }
    // handler ( resource parser, string target, string data )
    private function PIHandler($parser, $target, $data)
    {
    //PHP EVALUATION
    if ((strtolower($target)) == "php") {
     
    //eval($data); gust doesn't work if you want the
    //string added to the array
    $text .= '<?php '.$data.' ?>'; 
    ob_start();
    eval ('?>' . $text);
    $text = ob_get_clean();
    $this->stack[count($this->stack)-1]['data'] .= $text;
     
    }
     
    }
     
    private function defaultHandler($parser, $data)
    {
     
    }
     
    private function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
    $publicId) {
    if ($systemId) {
    if (!list($parser, $fp) = new_xml_parser($systemId)) {
    printf("Could not open entity %s at %s\n", $openEntityNames,
    $systemId);
    return false;
    }
    while ($data = fread($fp, 4096)) {
    if (!xml_parse($parser, $data, feof($fp))) {
    printf("XML error: %s at line %d while parsing entity %s\n",
    xml_error_string(xml_get_error_code($parser)),
    xml_get_current_line_number($parser), $openEntityNames);
    xml_parser_free($parser);
    return false;
    }
    }
    xml_parser_free($parser);
    return true;
    }
    return false;
    }
     
    private function new_xml_parser($file)
    {
     
    $xml_parser = xml_parser_create();
     
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
     
    xml_set_processing_instruction_handler($xml_parser, array (&$this, "PIHandler"));
     
    xml_set_element_handler($xml_parser, array (&$this, "startElement"), array (&$this, "endElement"));
     
    xml_set_character_data_handler($xml_parser, array ( &$this, "characterData"));
     
    xml_set_default_handler($xml_parser, array ( &$this, "defaultHandler"));
     
    xml_set_external_entity_ref_handler($xml_parser, array ( &$this, "externalEntityRefHandler"));
     
    if (!($fp = @fopen($file, "r"))) {
    return false;
    }
    if (!is_array($this->parser_file)) {
    settype($this->parser_file, "array");
    }
    $this->parser_file[$xml_parser] = $file;
    return array($xml_parser, $fp);
    }
     
    function NewParse($file)
    {
    if (!(list($xml_parser, $fp) = $this->new_xml_parser($file))) {
    die("could not open XML input");
    }
     
    //ERROR
    while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
    die(sprintf("XML error: %s at line %d\n",
    xml_error_string(xml_get_error_code($xml_parser)),
    xml_get_current_line_number($xml_parser)));
    }
    }
    //END
    xml_parser_free($xml_parser);
    return $this->stack;
    }
    }
    ?> 
    <?
    $p = new XMLParser();
    $stack = $p->NewParse("http://www.informatik-forum.at/external.php?type=XML");
    print("<pre>\n");
    print_r($stack);
    print("</pre>\n");
    ?>
    Alles anzeigen
  • Ordovicium
    Punkte
    3.693
    Artikel
    13
    Beiträge
    569
    • 21. Mai 2006 um 14:17
    • #8

    InspectorGadjet: 1000 Dank. Jetzt funktioniert es wunderbar.

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum