PHP XML Parser
Prolli
- xml
0 Felix Riesterer
0 Thomas J.S.0 Prolli
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>
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.
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.
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.
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.
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
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:
- in einem Element des XML Files können 2 Werte stehen. Je nachdem welcher Wert drin steht sollen unterschiedliche Grafiken angezeigt werden.
- 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
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:
- in einem Element des XML Files können 2 Werte stehen. Je nachdem welcher Wert drin steht sollen unterschiedliche Grafiken angezeigt werden.
- 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
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
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
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
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,
GunnarPS: Siehe PS in https://forum.selfhtml.org/?t=132596&m=858395
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
Ok, jetzt weiss ich auch was TOFU ist.
Du betreibst deinen eigenen Webserver?
Ich habe einen auf meinem Rechner zu Testzwecken installiert.
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