Prolli: PHP XML Parser

Hallo,
ich habe einen XML File, von dem ich einige der Inhalte in einer HTML Datei anzeigen möchte.

Ich bastle an einer Lösung mit xml_parser_create() in PHP.
Da ich blutiger Anfänger bin habe ich mich eines Scriptes aus "PHP für Dummies" bedient und entsprechend.
Das klappt auch im Grossen und Ganzen. 2 Probleme habe ich allerdings.
1. in einem Element des XML Files können 2 Werte stehen. Je nachdem welcher Wert drin steht sollen unterschiedliche Grafiken angezeigt werden.
2. Am Ende der Ausgabe stehen immer 2 "-", obwohl diese im XML File überhaupt nicht vorkommen.

Weiss jemand wie ich das mit den Grafiken hinbekomme? Kann ich irgendwie auf mit der Funkion auch den Inhalt abfragen?

Wie kann ich die "-" unterdrücken?

Danke
Prolli

Hier der Code:

<html>
<head>
 <title>TEST</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" >

<?php
// Die XML-Datei angeben.
$xmldatei = file("test.xml");

function startElement($xmlparser, $element) {
    global $html_ausgeben;

// den Elementnamen zur Sicherheit in Kleinbuchstaben umwandeln
    $element = strtolower($element);

// Den Elementnamen überprüfen
 if ($element=="time") {
        $html_ausgeben .= "<table><tr><td class=t_content>Zeit: ";
    }
    if ($element=="date") {
        $html_ausgeben .= "<td class=t_content>Datum:";
    }
 if ($element=="currentprice") {
        $html_ausgeben .= "<tr><td colspan=2 class=t_content>Aktueller Kurs:";
    }
 if ($element=="arrow") {
        $html_ausgeben .= "<tr><td colspan=2 class=t_content>Aktueller Kurs:";
    }
}

function endElement($xmlparser, $element) {
    global $html_ausgeben;

// den Elementnamen zur Sicherheit in Kleinbuchstaben umwandeln
    $element = strtolower($element);

// Den Elementnamen überprüfen
 if ($element=="time") {
        $html_ausgeben .= "</td> ";
  }

if ($element=="date") {
        $html_ausgeben .= "</td></tr>";
    }
 if ($element=="currentprice") {
        $html_ausgeben .= "</td></tr></table>";
    }
}

function cdata($xmlparser, $element) {
    global $html_ausgeben;

// Den eigentlichen Text des Dokuments an $html_ausgeben anhängen
    $html_ausgeben .= $element;

}

// Den XML-Parser erzeugen
$xmlparser = xml_parser_create();

// Das Element-Ereignis auslösen, wenn der Parser
// auf ein Start- oder Endelement trifft
xml_set_element_handler($xmlparser, "startElement", "endElement");

// Mit dieser Funktion die Daten (nicht die Tags!) verarbeiten
xml_set_character_data_handler($xmlparser, "cdata");

// Den Inhalt des Arrays Element für Element
// durch die Funktion xml_parse() parsen
foreach($xmldatei as $elem) {
     xml_parse($xmlparser, $elem);
}

// Die Ressourcen des XML-Parsers wieder freigeben und diesen zerstören
xml_parser_free($xmlparser);

// Die erzeugte HTML-Datei ausgeben
echo $html_ausgeben;
?>
</body>
</html>

  1. Liebe(r) Prolli,

    in den User-Kommentaren zu den PHP-XML-Parserfunktionen auf der Dokuseite findet sich eine Klasse zum bequemen Umwandeln von XML-Daten in ein PHP-Array. Damit bearbeite ich XML-Daten in meinen Scripten (u.a. in meinem GB-Script).

    Schau' es Dir doch einmal an! Der Autor heißt Raphael Schwarzschmid...

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo Felix,
      danke für den Tipp. Ich habe SelfHTML rauf und runter durchsucht. Leider finde ich nicht mal ansatzweise den Bereich, auf den Du verweist. Meinst Du eine andere Plattform?

      Gruß
      Rainer

      Liebe(r) Prolli,

      in den User-Kommentaren zu den PHP-XML-Parserfunktionen auf der Dokuseite findet sich eine Klasse zum bequemen Umwandeln von XML-Daten in ein PHP-Array. Damit bearbeite ich XML-Daten in meinen Scripten (u.a. in meinem GB-Script).

      Schau' es Dir doch einmal an! Der Autor heißt Raphael Schwarzschmid...

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. Hello out there!

        Ich habe SelfHTML rauf und runter durchsucht.

        Warum tust du das, wenn dir gesagt wird

        in den User-Kommentaren zu den PHP-XML-Parserfunktionen auf der Dokuseite

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

        See ya up the road,
        Gunnar

        PS: Bitte kein TOFU.

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. 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.

          1. Danke für den Code.

            Jetzt gibt es nur noch Probleme mit den Schreibrechten auf dem IIS.
            Der XML File kann nicht geöffnet werden "permission denied". Wobei die entsprechendne Einstellungen in PHP auf "on" stehen.
            Auf dem Apache läufts.

            (deren Bestandteile man mühelos nachlesen könnte)

            lesen ist nicht gleich verstehen -> liegt vielleicht daran, dass ich Anfänger bin

            Gruß
            Prolli

  2. Hallo,

    Du hast zwar recht einen neuen Thread zu eröffnen, es ist nun ein (etwas) anderes Thema, aber ...

    Ich bastle an einer Lösung mit xml_parser_create() in PHP. [...]
    Hier der Code:

    ...

    genau um solchen Verrenkungen aus dem Weg zu gehen, habe ich dir im https://forum.selfhtml.org/?t=132528&m=857764 die XML-XSL-Transformation empfohlen.

    Damit wären auch deine zwei Fragen:

    1. in einem Element des XML Files können 2 Werte stehen. Je nachdem welcher Wert drin steht sollen unterschiedliche Grafiken angezeigt werden.
    2. Am Ende der Ausgabe stehen immer 2 "-", obwohl diese im XML File überhaupt nicht vorkommen.

    sehr einfach gelöst.
    Falls du dich mit XSLT nicht auskennst, kannst du hier im Forum ja fragen.

    Grüße
    Thomas

    1. Hallo Thomas,
      danke. Ich habe es mit Deinem Lösungsansatz versucht, indem ich Deinen Code kopiert und entsprechend an meine Dateien angepasst habe.
      Leider erhalte ich beim Aufruf der Datei folgende Fehlermeldung:
      "Fatal error: Cannot instantiate non-existent class: domdocument"

      Muss ich da zuerst noch etwas installieren oder evtl. noch mehr Code in die Datei schreiben?

      Gruß
      Rainer

      <body>

      <?php
        $xmldoc=new DomDocument();
        $xmldoc->load("test.xml");

      $xsldoc=new DomDocument();
        $xsldoc->load("style.xsl");

      $xslt=new XsltProcessor();
        $xslt->importStylesheet($xsldoc);

      // Ergebnisausgabe als String
        $output=$xslt->transformToXml($xmldoc);
        print $output;
      ?>

      ?>

      </body>

      Hallo,

      Du hast zwar recht einen neuen Thread zu eröffnen, es ist nun ein (etwas) anderes Thema, aber ...

      Ich bastle an einer Lösung mit xml_parser_create() in PHP. [...]
      Hier der Code:
      ...

      genau um solchen Verrenkungen aus dem Weg zu gehen, habe ich dir im https://forum.selfhtml.org/?t=132528&m=857764 die XML-XSL-Transformation empfohlen.

      Damit wären auch deine zwei Fragen:

      1. in einem Element des XML Files können 2 Werte stehen. Je nachdem welcher Wert drin steht sollen unterschiedliche Grafiken angezeigt werden.
      2. Am Ende der Ausgabe stehen immer 2 "-", obwohl diese im XML File überhaupt nicht vorkommen.

      sehr einfach gelöst.
      Falls du dich mit XSLT nicht auskennst, kannst du hier im Forum ja fragen.

      Grüße
      Thomas

      1. Hello out there!

        Leider erhalte ich beim Aufruf der Datei folgende Fehlermeldung:
        "Fatal error: Cannot instantiate non-existent class: domdocument"

        Der Code ist PHP 5.

        In PHP 4 geht’s so:

        $xslt = xslt_create();  
        $xml = 'test.xml';  
        $xsl = 'style.xsl';  
        $result = xslt_process($xslt, $xml, $xsl);  
        xslt_free($xslt);  
        echo $result;
        

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. Hi Gunnar,
          danke. Wir verwenen tatsächlich PHP4.
          Leider bekomme ich mit Deinem Code folgende Fehlermeldung:
          Fatal error: Call to undefined function: xslt_create()

          Mache ich was falsch? (ich gehe fast davon aus)

          Gruß
          Rainer

          Hello out there!

          Leider erhalte ich beim Aufruf der Datei folgende Fehlermeldung:
          "Fatal error: Cannot instantiate non-existent class: domdocument"

          Der Code ist PHP 5.

          In PHP 4 geht’s so:

          $xslt = xslt_create();

          $xml = 'test.xml';
          $xsl = 'style.xsl';
          $result = xslt_process($xslt, $xml, $xsl);
          xslt_free($xslt);
          echo $result;

          
          >   
          > See ya up the road,  
          > Gunnar
          
          1. Hello out there!

            Fatal error: Call to undefined function: xslt_create()

            Dann bietet dein Server wohl keine XSLT-Unterstützung. phpinfo() gibt Auskunft. Frag deinen Hoster, ob er das nachinstalliert. Wenn nicht, überlege, ob du wechselst.

            See ya up the road,
            Gunnar

            PS: Siehe PS in https://forum.selfhtml.org/?t=132596&m=858395

            --
            “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
            1. Hallo,
              da ich blutiger Anfänger bin was PHP Programmierung und Konfiguration angeht stehe ich echt auf dem Schlauch.

              Prinzipiell habe ich die Möglichkeit PHP selbst zu konfigurieren (wenn ich es dann auch kann).
              Deshalb die Frage:
              Welches Modul benötige ich und wo kann ich es herunterladen?
              Muss ich das dann irgendwie installieren oder kann ich es einfach in ein entsprechendes Verzeichnis legen?

              Danke
              Rainer

              Hello out there!

              Fatal error: Call to undefined function: xslt_create()

              Dann bietet dein Server wohl keine XSLT-Unterstützung. phpinfo() gibt Auskunft. Frag deinen Hoster, ob er das nachinstalliert. Wenn nicht, überlege, ob du wechselst.

              See ya up the road,
              Gunnar

              PS: Siehe PS in https://forum.selfhtml.org/?t=132596&m=858395

              1. Hello out there!

                Würdest du bitte endlich den bereits zweimal gegebenen Hinweis zu TOFU beachten und den Unsinn sein lassen?

                Prinzipiell habe ich die Möglichkeit PHP selbst zu konfigurieren (wenn ich es dann auch kann).

                Du betreibst deinen eigenen Webserver?

                See ya up the road,
                Gunnar

                --
                “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
                1. Ok, jetzt weiss ich auch was TOFU ist.

                  Du betreibst deinen eigenen Webserver?

                  Ich habe einen auf meinem Rechner zu Testzwecken installiert.

          2. Hallo,

            danke. Wir verwenen tatsächlich PHP4.
            Leider bekomme ich mit Deinem Code folgende Fehlermeldung:
            Fatal error: Call to undefined function: xslt_create()

            Mache ich was falsch? (ich gehe fast davon aus)

            Wie Gunnar sagte: die XSLT-Unterstützung fehlt.
            Dazu brauchst du Sablotron:
            http://www.php.net/manual/de/ref.xslt.php (der linkt dor auf Gingerall lautet jetzt richig: http://www.gingerall.org/sablotron.html

            Wenn aber dann am Produktionsserver keine Unterstützung für Sablotron existiert und du es nicht nachinstallieren (lassen) kannst, bleibt dir wohl doch nur die Möglichkeit, mit deinem Anstaz zu weiterversuchen.

            Grüße
            Thomas