1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Klasse erzeugen

  • Ordovicium
  • 18. Mai 2006 um 01:07
  • Unerledigt
  • Ordovicium
    19
    Ordovicium
    Mitglied
    Reaktionen
    23
    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
    4
    anty
    Mitglied
    Reaktionen
    2
    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...

    anty.at

  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    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

    I like Toast!

  • Ordovicium
    19
    Ordovicium
    Mitglied
    Reaktionen
    23
    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
    19
    Ordovicium
    Mitglied
    Reaktionen
    23
    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
    1
    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
    5
    InspectorGadjet
    Mitglied
    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 :winking_face: 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

    90% aller Fehler sitzen 60 cm vor dem Bildschirm

  • Ordovicium
    19
    Ordovicium
    Mitglied
    Reaktionen
    23
    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.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung