8.3 Laden, Parsen und Speichern von XML in PHP 5

Das Laden und Parsen einer XML-Datei wurde in PHP 5 komplett abgeändert. PHP 5 bietet zwei Methoden zum Laden und Parsen der Klasse DomDocument an:

  • load()

  • loadxml()

Die Methode load() dient zum Laden und Parsen von XML-Dateien, während loadxml() XML-Dokumente parst, die als String vorliegen. Für das Speichern von XML-Dokumenten existieren in PHP 5 ebenfalls zwei Methoden der Klasse DomDocument:

  • save()

  • savexml()

Die Methode save() speichert einen geparsten Dokumentenbaum als neue XML-Datei, während savexml() – der Name ist etwas unglücklich gewählt – den Dokumentenbaum als String zurückgibt.

Hinweis: In PHP 5 wurde die Anzeige von Fehlermeldungen im Browser abgeändert. Mit PHP 5 werden keine Fehlermeldungen mehr im Browser angezeigt. Das ist für den Anwender sinnvoll, der etwaige Fehler im PHP-Skript ohnehin nicht korrigieren kann, aber für den Programmierer selbst etwas ungünstig, da einfache Fehler (z.B. Datei nicht vorhanden, Semikolon vergessen usw.) nicht mehr automatisch angezeigt werden. Um eine Anzeige von Fehlermeldungen im Browser wie in PHP 4.x zu erhalten, muss in der php.ini-Datei der Parameter display_errors auf On gesetzt werden. Standardmäßig ist dieser in PHP 5 auf Off gesetzt.

8.3.1 XML-Dateien laden und parsen

Die Funktionen domxml_open_file() und xmldocfile() können Sie in PHP 5 zunächst nicht mehr einsetzen. Die Klasse DomDocument besitzt jetzt Methoden zum Laden und Speichern einer Datei. Nur über diese Methoden ist ein Zugriff auf XML-Dateien möglich.

<?php
$dom = new DomDocument();
$dom->load(
"test.xml");
if(!$dom) {
exit ("Fehler beim Parsen");
}
?>

Bevor eine XML-Datei geladen und geparst werden kann, muss ein leerer Dokumentenbaum über die Klasse DomDocument erzeugt werden. Dies erfolgt über den Konstruktor der Klasse DomDocument:

$dom = new DomDocument();

Der Konstruktor wird wie in der Programmiersprache Java über das Schlüsselwort new und den Konstruktoraufruf (DomDocument()) eingesetzt. Der Konstruktoraufruf lautet in PHP 5 immer wie die Klasse selbst. Bei diesem Konstruktor der Klasse DomDocument handelt es sich zunächst um einen so genannten parameterlosen Konstruktor, d.h. es wurden keine Übergabeparameter angegeben. Daher kann er auch ohne Klammern notiert werden:

$dom = new DomDocument;

Der Konstruktor kennt zwei mögliche Übergabeparameter, die auch weggelassen werden können. An den Konstruktor können die Versionsnummer von XML und der Zeichensatz angegeben werden:

$dom = new DomDocument("1.0","iso-8859-15");

Der erste Parameter gibt die Versionssnummer von XML an und der zweite Parameter enthält den Zeichensatz, dem das XML-Dokument zu Grunde liegt. Wird der erste Parameter weggelassen, nimmt PHP immer die Versionssnummer 1.0 an. Wird der zweite Parameter nicht angegeben, nimmt PHP immer den Zeichensatz UTF-8 an.

Hinweis: Die Groß-Kleinschreibung bei einem DOM XML-Konstruktor wird von PHP nicht berücksichtigt. Diese Schreibweisen sind korrekt und werden akzeptiert:

$dom = new domdocument();

$dom = new domDocument();

$dom = new Domdocument();

Der Rückgabewert des Konstruktors ist ein Objekt der Klasse DomDocument. Es enthält einen leeren Dokumentenbaum, der zunächst nur über einen XML-Prolog verfügt. Über die Methode load() der Klasse DomDocument kann jetzt eine XML-Datei geladen und als Dokumentenbaum bereit gestellt werden:

$dom->load("test.xml");

Zum Laden wird die neue Methode load() eingesetzt. Sie ersetzt im Prinzip die Methode domxml_open_file() aus PHP 4.x. An die Methode load() wird der Dateiname der XML-Datei übergeben. Die Datei wird jetzt geladen und geparst. Bei einem Fehler in der XML-Datei wird kein Dokumentenbaum erzeugt, sodass in einer if-Abfrage auf den negativen Inhalt von $dom geprüft werden kann:

if(!$dom) {

exit ("Fehler beim Parsen");

}

Sollte die XML-Datei dagegen korrekt geladen und geparst worden sein, liegt in $dom der Dokumentenbaum vor, und über die Methoden von der Klasse DomNode bzw. DomDocument sind die Inhalte zugänglich.

Pfadangaben beim Laden einer XML-Datei

Beim Laden einer XML-Datei in PHP 4.x unter Windows gab es das Problem, dass eine Datei, die ohne Pfadangaben geladen wurde, aus dem Apache-Installationsverzeichnis geladen wurde. Unter Linux und UNIX erfolgt das Laden aus dem aktuellen Verzeichnis, in dem sich die PHP-Datei befindet. Daher muss speziell für Windows beim Laden (und Speichern) die Funktion dirname() verwendet werden, damit die XML-Datei aus dem aktuellen Verzeichnis geladen wird.

In PHP 5 unter Windows wurde dieses Verhalten geändert. Wird an die load()-Methode nur der Dateiname übergeben

$dom->load("test.xml");

wird jetzt die Datei immer aus dem aktuellen Verzeichnis geladen. Im Prinzip ist die Verwendung von dirname() nicht mehr nötig. PHP 5 unter Linux bzw. UNIX zeigt das gleiche Verhalten, das auch schon in PHP 4.x enthalten war.

Bultin Schemes

Die load()-Methode enthält so genannte Builtin Schemes. Neben dem Laden einer lokalen Datei können verschiedene Schemes angegeben werden, u.a. http oder ftp. Dadurch können direkt XML-Dateien von anderen Servern über diese Protokolle geladen werden:

$dom->load("http://www.xmlguru.de/test/test.xml");

Interessant ist auch die Möglichkeit, direkt gezippte XML-Dateien in den Formaten gz und bzip2 anzugeben. Diese werden beim Laden direkt entpackt und der Dokumentenbaum erstellt:

$dom->load("compress.zlib://index.xml.gz");

Folgende Schemes werden von der load()-Methode unterstützt:

  • http

  • ftp

  • https

  • ftps

  • php

  • compress.zlib (für gz und bzip2)



Nächster Schritt: XML-Dokumente als Strings parsen

Hinweis: Dies ist ein Text von Michael Seeboerger-Weichselbaum. Es stammt aus dessem Buch "PHP & XML für Web-Developer" aus dem Software & Support-Verlag. Das Urheberrecht liegt bei Michael Seeboerger-Weichselbaum.


© msw 1999-2005