Felix Riesterer: PHP XML Parser

Beitrag lesen

Lieber Gunnar,

Die PHP-Doku ist unter http://php.net/

da habe ich den OP wohl überschätzt und hätte besser den Link gleich mitgeliefert...

PS: Bitte kein TOFU.

Ja, das wünsche ich mir auch!

Ich mache mir jetzt einmal die Mühe, die XML-Parser-Klasse (deren Bestandteile man mühelos nachlesen könnte) hier aufzulisten. Wesentliche Teile des Codes stammen von Raphael Schwarzschmid:

if (!class_exists('XMLParser'))  
{  
class XMLParser  
   {  
   var $filename;  
   var $xml;  
   var $data;  
  
   function XMLParser($xml_file)  
      {  
      $this->filename = $xml_file;  
      $this->xml = xml_parser_create();  
      xml_set_object($this->xml, $this);  
      xml_set_element_handler($this->xml, 'startHandler', 'endHandler');  
      xml_set_character_data_handler($this->xml, 'dataHandler');  
      $this->parse($xml_file);  
      }  
  
   function parse($xml_file)  
      {  
      if(!($fp = fopen($xml_file, 'rb+')))  
         {  
         die('Cannot open XML data file: '.$xml_file);  
         return false;  
         }  
  
      $bytes_to_parse = 65536; // Bei kleineren Werten gabe es schon  
                               // seltsame Datenschwünde... Ein Fehler  
                               // in der PHP-Funktion selbst?  
  
      while ($data = fread($fp, $bytes_to_parse))  
         {  
         $parse = xml_parse($this->xml, $data, feof($fp));  
  
         if (!$parse)  
            {  
            die(  
                sprintf("XML error: %s at line %d",  
                xml_error_string(xml_get_error_code($this->xml)),  
                xml_get_current_line_number($this->xml)));  
                xml_parser_free($this->xml  
                );  
            }  
         }  
  
      return true;  
      }  
  
   function startHandler($parser, $name, $attributes)  
      {  
      $data['name'] = $name;  
      if ($attributes) $data['attributes'] = $attributes;  
      $this->data[] = $data;  
      }  
  
   function dataHandler($parser, $data)  
      {  
      if($data = trim($data))  
         {  
         $index = count($this->data) -1;  
         if(isset($this->data[$index]['content'])) $this->data[$index]['content'] .= $data;  
            else $this->data[$index]['content'] = $data;  
         }  
      }  
  
   function endHandler($parser, $name)  
      {  
      if (count($this->data) > 1)  
         {  
         $data = array_pop($this->data);  
         $index = count($this->data) - 1;  
         $this->data[$index]['child'][] = $data;  
         }  
      }  
   }  
}

Benutzt wird die Klasse so:

$array_der_xml_daten = new XMLParser($datendatei);  
print_r($array_der_xml_daten);

Jedenfalls setze ich diese Klasse so erfolgreich in meinem Gästebuch-Script ein.

Liebe Grüße aus Ellwangen,

Felix Riesterer.