Hallo Thomas,
ich habe da was mit XPath gefunden (namespace-uri), allerdings bekomme ich das nicht in PHP zum laufen:
$xpath = $dom->xpath_new_context();
$node = xpath_eval_expression($xpath, "namespace-uri(//root/summary/div)");
Vielleicht klappt dieser XPath-Ausdruck besser:
namespace-uri(/*:root/*:summary/*:div)
In XPath-Ausdrücken kann man auch Namensräume verwenden. Allerdings nicht mit URI sondern mit Präfix. Sprich: "//atom:summary" wäre ein XPath-Ausdruck, der einem alle summary-Elemente aus Atoms Namensraum zurückgibt – vorausgesetzt das Präfix "atom" ist an die richtige URI gebunden. Für die Verwendung von XPath ausserhalb von XML, sprich in einer Programmiersprache muss man dann die von einem verwendeten Präfixe registrieren. Üblicherweise geschieht das mit einem Namensraum-Resolver, aber die Implementierung scheint dafür eine Funktion namens xpath_register_ns() vorzusehen. Ich hab nun den obigen XPath-Ausdruck mit Wildcards für die Namensräume verwendet, schließlich sind in Deinem Beispiel-XML root-, summary- und div-Elemente nicht im selben Namensraum. Ich kann mir schon vorstellen, dass dieses recht merkwürdige DOM XML von PHP 4 darüber ins Stolpern kommt.
Zweiter Vorschlag: xpath_eval() kann – lese ich die „Dokumentation“ richtig – auch XPath-Ausdrücke auf einzelne Knoten ausführen. Ich würde dann dieses vorschlagen:
xpath_eval($xpath_context, "namespace-uri(.)", $element);
Als Argument habe ich in diesem XPath-Ausdruck nur den Punkt (".") übergeben, der in XPath soviel heisst, wie „aktueller Knoten“ – also hoffentlich derjenige, der durch das Argument $element bestimmt wird.
Allerdings: Das ist alles ungetestet und reine Mutmassung; ich habe wenig Ahnung von PHP und noch weniger von dieser laut „Dokumentation“ extrem beknackten Variante des DOMs von PHP 4. Wenn Du meinen ungebeteten Rat als PHP-Unkundiger haben willst: Nimm die andere DOM-Implementierung, die sieht sehr viel vollständiger aus – vor allem hat sie das Attribut DOMNode.namespaceURI.
Ansonsten fiele mir auch nichts ein, ausser selbst ein Namespace-Lookup mit den bestehenden von diesem DOM XML bereitgestellten Funktionen zu schreiben, sprich vom Element ausgehend immer weiter im Baum nach oben gehen und bei den jeweiligen Elternelement nach mit "xmlns" beginnenden Attributen Ausschau zu halten, sowohl in der Variante mit als auch ohne Präfixen.
Tim