XML-Parser

In den folgenden Abschnitten wird nun beschrieben, wie XML mit PHP verarbeitbar wird. Dafür existieren innerhalb von PHP mehrere Technologien. Generell lässt sich zwischen zwei großen Möglichkeiten des Parsens unterscheiden:

  • Einmal ist es möglich, die XML-Datei an einem Stück einzulesen. Erkennt der Parser dann Tags oder Text, so teilt er dies dem eigenen Code entsprechend mit. Der eigene Code ist dann dafür zuständig, die gewünschten Daten aus der XML-Datei zu sammeln und für das weitere Programm zur Verfügung zu stellen. Ist allerdings der Dateizeiger an einer Information innerhalb der XML-Datei einmal vorbei gelaufen, so wird diese Information nie wieder geliefert. Dieses sequentielle Einlesen hat den Vorteil, dass wenig Speicher gebraucht wird und auch sehr große XML-Dateien verarbeitet werden können.
  • Eine andere Möglichkeit ist es, dass der Parser den Baum der XML-Datei zu Beginn komplett ließt und dann traversierbar im Speicher zur Verfügung stellt. Das klappt nur dann, wenn die XML-Datei klein genug ist, dass deren Repräsentation innerhalb des Arbeitsspeichers Platz hat. Weiterhin wird zu Beginn etwas Zeit verbraucht, ohne dass Daten verfügbar sind, da der Parser den Baum zunächst aufbauen muss. Ein großer Vorteil ist die Traversierbarkeit. So kann einfach auf Strukturinformationen zugegriffen werden.

Der Standard-XML-Parser von PHP verfolgt erste Strategie. Die XML-Datei wird sequentiell eingelesen und entsprechende Handler aufgerufen.

Damit der folgende Code ausgeführt werden kann, muss die Bibliothek LIBXML installiert sein, die allerdings standardmäßig mittlerweile mit PHP ausgeliefert wird.

Folgender PHP-Code demonstriert das sequentielle Lesen:

Nachdem die XML-Datei mit fopen() geöffnet worden ist, wird der Parser mit xml_parser_create() erzeugt. Dem Parser wird mit der Funktion xml_set_element_handler() mitgeteilt, dass er bei einem Öffnungs-Tag, die weiter oben definierte Funktion startElement() aufrufen soll und bei einem Schließungs-Tag die oben definierte Funktion endElement(). Weiterhin wird ihm mit xml_set_character_data_handler() mitgeteilt, dass er die Funktion characterData() aufrufen soll, um die Rümpfe zu verarbeiten.

Innerhalb der While-Schleife wird die XML-Datei in kleinen Blöcken eingelesen und dem Parser übergeben. Hier findet auch eine Fehlerbehandlung statt, falls der Parser das eingegebene XML nicht verarbeiten kann. Beispielfehlercodes befinden sich in den Konstanten XML_ERROR_SYNTAX, XML_ERROR_INVALID_TOKEN oder XML_ERROR_UNKNOWN_ENCODING.

Zum Schluss erfolgt das Schließen der Datei und das Freigeben der Ressourcen des XML-Parsers. Dies ist wichtig, um die belegten Ressourcen im Arbeitsspeicher anderen Programmteilen zur Verfügung zu stellen und sie nicht unnötig zu belegen.

Innerhalb der beiden Funktionen startElement() und endElement() wird mit Switch-Anweisungen zwischen dem Tag-Namen unterschieden und eine entsprechende Ausgabe gemacht. Hier wäre es nun auch möglich globale Variablen zu setzen, um die Baumstruktur der XML-Datei auszuwerten. Innerhalb der Funktion characterData() wird – falls vorhanden – der Textrumpf innerhalb eines Tags ausgegeben.

Die Ausgabe des Beispiels ist nun: Bild startet: ( Kreis Linie Tag A Rechteck Text Im Rumpf: SVG ist XML ) Bild beendet.

Der Standard-XML-Parser von PHP hat weitere Besonderheiten. So ist es möglich, Namespaces aufzulösen, indem er über die alternative Funktion xml_parser_create_ns() erzeugt wird. Der Parser kann mit drei unterschiedlichen Encodings umgehen: UTF-8, US-ASCII und ISO-8859-1, wobei UTF-8 das Standardencoding darstellt. Das Encoding für die Eingabe kann bei der Initialisierung des Parsers mit übergeben werden und ist dann fix für diesen Parser. Bei der Übergabe an die vom Nutzer bereitgestellten Funktionen kann jedoch das Encoding der übergebenen Strings nochmals gewechselt werden. Dies ist jederzeit tauschbar mit der Funktion xml_parser_set_option("XML_OPTION_TARGET_ENCODING",...). Werden Zeichen gelesen, die im Encoding nicht dargestellt werden können, so erzeugen diese einen Parser-Fehler. Werden Zeichen übergeben, die nicht dargestellt werden können, so werden diese durch Fragezeichen (?) ersetzt. Weitere Optionen sind setzbar, wie das Umwandeln der Tagnamen in Großbuchstaben (XML_OPTION_CASE_FOLDING) oder das Eliminieren von White-Spaces (XML_OPTION_SKIP_WHITE).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert