XML-Parsing

Verarbeitung von XML-Daten

>
Die modernste Methode, Daten zu codieren, ist XML. Die Dateien bestehen nur aus einfachem Text und sind daher mit allen Standard-Programmen kompatibel. Hier wird gezeigt, wie sich XML-Daten mit PHP zu ganz unterschiedlichen 'Produkten' verarbeiten lassen.
PHP PHP Hypertext Processor
Demonstration XML-Daten als HTML-Tabelle, Grafik, Text, SQL-Script, . .
XML-Daten Zufalls-Daten zum Demo-Beispiel 'Farben'
Grundstruktur Aufbau eines XML-Parsers mit PHP-Funktionen
Event-Handler Behandlung der Parser-Ereignisse

XML-Daten als HTML-Tabelle und als SVG-Grafik:

XML-Daten 'Farben' als HTML-Tabelle dargestellt:
NrFarbeRGB 
1lime02550
2maroon12800
3teal0128128
4silver192192192
5zufall59117165
Die gleichen XML-Daten als Grafik:
Ihr Browser kann SVG nicht anzeigen
Aus den 'Umgebungs-Daten' ihres Browsers geht hervor, dass sie vermutlich keine SVG-Grafik sehen können.
Details dazu finden sie Kapitel SVG dieses Webs.
Die beiden hier gezeigten Beispiele benutzen die gleichen XML-Daten, lediglich unterschiedlich eingestellte ↓ Parser. Die verwendeten ↓ Daten sehen sie im ↓ nächsten Kapitel.   Mit Klick erzeugen sie neue Zufalls-Daten.

Flexibilität:

Diese Technik eignet sich dazu, XML-Daten in fast beliebiger Weise zu verarbeiten. Alle modernen Standard-Programme können XML-Daten erzeugen oder verarbeiten.
SVG ist ein → XML-Standard für Objekt-Grafik.
SVG-Daten erfordern viel weniger Platz und Datenverkehr als Pixel-Daten. Daher verbreitet sich SVG derzeit im Mobilfunk-Bereich (WML) besonders rasch.
Die Verwendung eigener XML-Parser-Programme ist natürlich nicht auf Webserver beschränkt. Eigene Programme in Java, Perl oder PHP laufen auf jedem PC - bei guter Programmierung unabhängig vom Betriebssystem !
Vorteile mit XML Die gesamte hier gezeigte Technik benutzt Offene Standards und ist daher kostenlos, nicht lizenzpflichtig und unabhängig von einzelnen Herstellern.
Eine interessante Variante ist der Einsatz von → XSL (wird von allen gängigen Browsern beherrscht). In diesem Fall werden vom Webserver nur die XML-Daten gesendet, das Parsen wird vom Browser am Client-PC ausgeführt.
Das entlastet den Webserver und reduziert den Datenverkehr.
Leider kann mit XSL derzeit noch keine SVG-Grafik erstellt werden, das ist jedoch in den nächsten Browser-Versionen zu erwarten.
Details zum Thema XSL.

XML-Daten als Text oder SQL-Script

XML-Daten 'Farben' als einfacher Text:
Diese beiden Beispiele sind eher trocken. IT-SpezialistInnen kennen jedoch die weitreichenden Möglichkeiten ...

Farbe[1] = {lime, rgb(0,255,0) };
Farbe[2] = {maroon, rgb(128,0,0) };
Farbe[3] = {teal, rgb(0,128,128) };
Farbe[4] = {silver, rgb(192,192,192) };
Farbe[5] = {zufall, rgb(59,117,165) };
Die gleichen Daten als SQL-Script

UPDATE farben SET name='lime', r=0, g=255, b=0 WHERE nr=1;
UPDATE farben SET name='maroon', r=128, g=0, b=0 WHERE nr=2;
UPDATE farben SET name='teal', r=0, g=128, b=128 WHERE nr=3;
UPDATE farben SET name='silver', r=192, g=192, b=192 WHERE nr=4;
UPDATE farben SET name='zufall', r=59, g=117, b=165 WHERE nr=5;
Das Schöne an XML-Daten: Alle 4 hier gezeigten Beispiele (HTML-Tabelle, SVG-Datei, Text, SQL-Script) wurden mit dem gleichen (kleinen) Parser erstellt. Um die jeweilige Variante zu erzeugen, müssen nur wenige Zeilen der Ausgabe-Funktion geändert werden.

XML-Daten

Diese Zufalls-Daten werden für das Demo-Beispiel verwendet. Sie enthalten Daten (Farbname,R,G,B) einiger HTML-Standard-Farben sowie einer Zufallsfarbe.
Die Daten könnten alternativ auch aus jeder anderen Quelle stammen, z.B. aus einer Datenbank, ...

Der offene XML-Standard erlaubt die Codierung praktisch aller denkbarer Daten in Form von Text-Dateien. Die Werte werden zur Kennzeichnung in 'tags' wie in HTML eingeschlossen.

Die tags (z.B. <farbe></farbe> ) können aus einem normierten Namespace stammen oder (wie hier) frei gewählt werden. Die einzelnen Elemente dürfen beliebig tief gestaffelt werden, einander jedoch nicht überschneiden. Insgesamt ergeben sie einen 'hierarchischen Baum'

XML-Parser sind Standard-Programme bzw. -Module von Programmiersprachen, welche es erlauben, XML-Daten mit einfachsten Mitteln in jede gewünschte Form für Transport oder Darstellung umzuwandeln.

Details zu XML und XML-Daten.

Erzeugung der Zufallsdaten: Beim Laden der Seite wird von einem PHP-Programm (am Webserver) eine neue XML-Datei erzeugt. Anzahl und Werte der Daten werden mit einem Zufallsgenerator gesteuert. Die XML-Datei wird von den Parsern dieser Seite dazu benutzt, die verschiedenen Ausgabeformate zu erzeugen. Nach einigen Minuten wird die XML-Datei vom Server gelöscht.
<?xml version='1.0' ?>
<!-- made by pstrainer@gmx.net -->
<demo>
<farbe>
    <name>lime</name>
    <r>0</r><g>255</g><b>0</b>
</farbe>
<farbe>
    <name>maroon</name>
    <r>128</r><g>0</g><b>0</b>
</farbe>
<farbe>
    <name>teal</name>
    <r>0</r><g>128</g><b>128</b>
</farbe>
<farbe>
    <name>silver</name>
    <r>192</r><g>192</g><b>192</b>
</farbe>
<farbe>
    <name>zufall</name>
    <r>59</r><g>117</g><b>165</b>
</farbe>
</demo>

Parser-Grundstruktur

Ein 'Parser' ist ein Programm, welches Daten liest und verarbeitet.
Alle modernen Standard-Programme enthalten Parser für die Eingabe und Ausgabe ihrer Daten im XML-Format.
Mit XML-Parsern können XML-Daten in alle gängigen Daten-Formate umgewandelt werden. Alle modernen Programmiersprachen verfügen über Parser-Module.
In dieser Webseite wird ein XML-Parser verwendet, um die gleichen Daten wahlweise in eine HTML-Tabelle und / oder in eine SVG-Grafik umzuwandeln.
An dieser Stelle wird das Prinzip eines XML-Parsers als SVG-Grafik dargestellt.
Aus den 'Umgebungs-Daten' ihres Browsers geht hervor, dass sie vermutlich keine SVG-Grafik sehen können.
Details dazu finden sie Kapitel SVG dieses Webs.
Alle verwendeten Funktionen stammen aus dem PHP-Modul xml
Zunächst wird geprüft, ob das Modul geladen wurde.
Details: verfügbaren Funktionen des PHP-Moduls.
$xml_ok = 0;
if (extension_loaded("xml") {xml_ok++;}

Live-Live-PHP-PHP-Daten:   $xml_ok = 1
Ein XML-Parser kann sehr einfach aufgebaut werden:

Mit Funktion xml_parser_create wird ein Parser-Objekt (hier $p )erzeugt. Dieses Objekt wird in allen folgenden xml-Funktionen verwendet.

Die Funktionen tag_a bzw tag_z werden als 'Handler' (Ereignis-Bearbeiter) für Anfang und Ende von tags definiert, tag_d wird als Handler für die (zwischen den tags liegenden) Daten definiert. Im nächsten Absatz finden sie Erklärung und Beispiele für die Handler-Funktionen.

Die XML-Datei (hier xml_161001.xml ) wird geöffnet und mit Funktion xml_parse verarbeitet. Wenn dabei Parser-Events auftreten, werden die jeweiligen Handler-Funktionen aufgerufen.

Nach Gebrauch wird die Datei mit Funktion fclose geschlossen und der Parser mit Funktion xml_parser_free freigegeben.
$path = "xml_161001.xml";
// XML-Parser erzeugen
$p = xml_parser_create();
// Event-Handler definieren
xml_set_element_handler($p,"tag_anf","tag_end");
xml_set_character_data_handler($p,"tag_dat");
$fp = fopen($path,"r");
if($fp) {
while ($data = fread($fp,10000)) {
// Daten parsen
$x=xml_parse($p,$data,feof($fp));
if(!$x) {printf "XML error ... ";}
}
@fclose($fp);
}
xml_parser_free($p);
Details zum Öffnen und Lesen von Dateien finden sie der Seite PHP & Dateisystem. In allen anderen Programmiersprachen arbeiten Parser ganz ähnlich. Beachten sie die Möglichkeit, den in allen modernen Browsern enthaltenen → XSL-Parser zu verwenden.

Event-Handler

Event-Handler sind Programme, die bei bestimmten Ereignissen aufgerufen werden.
Im ↑ Parser wurden die Handler für 3 Ereignisse definiert:
tag-Anfang (z.B. <farbe> oder <name>), tag-Ende (z.B. </farbe> oder </name> ) und tag-Daten (zwischen Anfang und Ende wurden Daten gefunden).
Die Programmierung folgt einem einfachen Schema:
Es muss festgelegt werden, welche Funktion bei einem bestimmten Event aufgerufen werden soll.
Dann wird eine Aufgabe ausgeführt (hier: XML-Datei wird gelesen).
Jedesmal wenn ein bestimmtes Event eintritt, wird die entsprechende Handler-Funktion ausgeführt.
Beispiel:
Die oben Live gezeigte Ausgabe wird von diesen Funktionen (vereinfacht) ausgeführt.
Jede Parser-Funktion erhält als erstes Argument das Parser-Objekt (Sie können mehrere Parser gleichzeitig betreiben).
Die Element-Handler erhalten als Argument den Namen des jeweils auslösenden tags in Großbuchstaben.
Der Element-Start-Handler erhält zusätzlich die Daten allfälliger Attribute.
Der Daten-Handler erhält die Daten zwischen den tags.

Die 3 gezeigten Handler führen hier (vereinfacht) keine andere Arbeit aus, als mit print auszugeben, was gefunden wurde. In der Praxis legen sie in diesen Funktionen fest, was mit den gefundenen Daten geschehen soll.
function tag_anf($parser,$tag,$atts) {
if($tag=="FARBE") {print "<br>";}
print "tag_anfang($tag), ";
}
function tag_dat($parser, $data) {
print "tag_daten($data), ";
}
function tag_end($parser, $tag) {
if($tag=="DEMO") {print "<br>";}
print "tag_ende($tag), ";
}


Fatal error: Call to undefined function write_my_modif_time() in /home/topsoft.at/www.topsoft.at/pstrainer/entwicklung/php/xml/xml_parsing.php on line 921