Christian Seiler: DOM XML-Modul, u.a. domxml_open_file()

Beitrag lesen

Hallo Leidgenosse,

ich hab' vor ziemlich genau 4 Monaten auch mal angefangen, mit DOMXML unter PHP XML-Dateien zu parsen. Ich habe dann resigniert aufgegeben. Das SAX-Interface war mir zu Low-Level, daher wollte ich das nicht nehmen.

Wirklich interessant für mich ist aber das DOM XML-Modul. Um die Testdatei und später die zu bearbeitenden Dateien zu öffnen, wollte ich domxml_open_file() benutzen, aber das funktioniert gar nicht, es liefert einfach false zurück (über das Apache-Modul). Wenn ich es über den Interpreter laufen lasse (Kommandozeile), werden die Entities bemeckert: index.html:39: error: Entity 'auml' not defined usw., false wird außerdem zurückgegeben. Ohne dass die Funktion je eine DTD gelesen hat, kann sie sich natürlich auch nicht darüber beschweren, dass keine Entities definiert sind, dachte ich mit meinem Halbwissen... :)

Das sollte sie sich auch nicht, aber sie tut es trotzdem. Eigentlich müsste sie die DTD lesen oder aber "einfach so" parsen. Was noch witziger ist: Egal, was man als DTD angibt, sie (die Funktion) parsed das so und so, nur wenn irgendwelche Entities (die nicht in XML Standard sind) vorhanden sind, meckert sie. Genau an diesem Problem bin ich auch gescheitert.

Folglich weiche ich auf domxml_open_mem() aus:
if ($dom=domxml_open_mem(join('', file($file)))) {
echo('success');
...
}
Was anscheinend funktioniert, aber dennoch werden vom Interpreter die Zeichenreferenzen bemängelt. Übrigens kann ich auch nicht das Modul mit error_reporting(E_ALL) dazu bringen, die Fehler zu zeigen, welche der Interpreter ausgibt.

Die Fehlerbehandlung der DOMXML-Module hat auch bei mir gesponnen. Ich habe nämlich gar keine bekommen. Dann habe ich immer das Kommandozeilentool verwendet, das den gleichen Parser benutzt, um an die Fehler zu kommen.

Das würde mich also nicht stören, wenn denn der Rest funktionieren würde. Alle versuche mit get_element_by_id() (IDs natürlich vorhanden) und get_elements_by_tagname() schlagen fehl, es wird immer false zurückgegeben, und ich verwende sie genauso wie in der Dokumentation beschrieben, sogar wenn ich die Beispiele Eins zu Eins kopiere, funktionieren sie nicht.

Hast Du schon mal xmltree (http://www.php.net/manual/en/function.domxml-xmltree.php) probiert? Dann weißt Du wenigstens über print_r, wieviel vom Dokument der Parser denn überhaupt verarbeitet.

Vielleicht hat jemand Erfahrungen damit gemacht, ich habe keine Idee mehr, warum es nicht funktioniert. Ich verwende PHP 4.2.1 (und Apache 1.3.26), gleich werde ich auf 4.2.3 upgraden, habe aber nicht viel Hoffnung. Die Funktionen sind scheinbar alle noch sehr neu und frisch, da ist sogar zum Teil 4.3.0 angegeben und anstatt der Angabe, ab welcher Version die Funktionen implementiert sind, wird lediglich "no version information, might be only in CVS" angegeben, wobei die Benutzerkommentare definitiv älter sind als ein aktueller CVS-Build, es müsste also wenigstens ein Fehler ausgegeben werden, wenn die Funktionen unbekannt wären.

Ich habe das schon mit PHP 4.0 und 4.1 probiert - die gleichen Probleme. Ich schätze mal einfach, dass der Parser einfach noch nicht ausgereift genug ist. Wenn ich mal Zeit habe, überlege ich mir, ob ich die Funktionalität nicht als Layer über den SAX-Parser realisieren kann. Den habe ich aber bisher noch überhaupt nicht probiert, ist aber laut Doku nicht experimentell, im Gegensatz zum DOMXML.

Grüße,

Christian