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