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

Hallo zusammen,

momentan probiere ich die XML Funktionen von PHP aus, um eine Seite damit einfacher administrieren zu können, genauer gesagt die Module XML und DOM XML.  Nicht dass ich viel Ahnung von XML habe, aber ich möchte es lernen, und da meine Seiten in XHTML geschrieben sind, bieten sich die Module eher an als mein extrem aufwändiges und nicht automatisierbares globales Bearbeiten über Reguläre Ausdrücke und Include-Anweisungen. XSLT ist vorerst noch keine Option, denn ich habe auch nichts Großes vor, außerdem ist es mehr oder weniger nur eine Spielerei, weil ich serverseitig keine Möglichkeiten habe und deshalb auf meiner "Entwicklerseite" alle Möglichkeiten ergreifen möchte, von der Änderung unterschiedlicher Templates bis hin zum Upload alles zu automatisieren. Wenn ich "mal eben" ein Element in den Baum an einer bestimmten Stelle in dutzenden Dokumenten einhängen möchte oder XHTML-interne Transformationen durchführen möchte, komme ich mit Regulären Ausdrücken meist nicht weit, denn sie geben nur vor, die Dokumentstruktur zu verstehen, egal wie komplex ich sie mache. Genug vorweg. :)

Den XML-Parser bekomme ich ohne Probleme zum laufen und bei einem simplen XHTML 1.1-Testdokument werden auch keine Fehler ausgegeben, also wohlgeformt ist es. Der W3C Validator segnet auch die Validität ab, einen anderen Prozessor habe ich momentan nicht, aber das Dokument ist nach meinem Ermessen tadellos.

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... :)
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.

Zwar hatte ich vor, die Funktionen in PHP-Skripten nutzen, welche u.a. über Batch-Skripte ausgeführt und umgeleitet werden, aber bei
  php -q skript.phps [parameter] > [zieldatei]
werden die Interpreterfehler kurioserweise nicht mit in die Datei geschrieben.
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.

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.

Grüße,
Mathias

  1. Hallo,
    DOM XML ist in PHP noch experimentell, siehe http://www.php3.de/manual/de/ref.domxml.php im oberen Kasten.

    Grüße
    Thomas

  2. 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