Frage zu xpath in php5

Inspector

Erfahrenes Mitglied
Hi allseits.

Ich hätte da mal eine Verständnisfrage. Ich lade mit php5 ein xhtml Dokument als domDocument:
PHP:
$xhtml = new DOMDocument;
$xhtml->load('newblog.xhtml');
Klappt so weit prima. Dann erstelle ich ein xpath Objekt und versuche damit, ein bestimmtes Element zu finden:
PHP:
		$xpath = new DOMXPath($xhtml);
		$secondary = $xpath->query("//*[@id='secondary']")->item(0) or die("Error: No secondary found");
So in der Form klappt das auch. Wenn ich allerdings den querystring noch um den Elementnamen ergänze, wird Nix gefunden. Wenn ich das id Attribut weglasse und irgendein Element angebe, wird ebenfalls Nix gefunden. Selbst das Element "html" wird nicht gefunden. Nur wenn ich "/" eingebe, wird ein Element gefunden.

Ach ja, $xhtml->getElementById("secondary") liefert ebenfalls Nix.

Wo liegt da bei mir der Denkfehler?
 
Hi

es ist eine normale xhtml Datei. Das gesuchte Element ist ein div und als solches ein direktes Kindelement von body. Also eigentlich Nix besonderes.

Mit dem "*" komme ich weiter, auch bei Elementen sehr viel weiter unten im Baum (die diversen Inputs des Formulars), nur eben mit der Angabe des Elementnamens klappt Nix, gar Nix.

Nachtrag: Wenn Du willst, kannst Du Dir die xhtml Datei ansehen. Eine Kopie davon findest Du unter http://www.rorkvell.de/prj/flexblog/newblog.xhtml
Dabei klappt genau das Gleiche an anderer Stelle mit einer rss Datei ganz hervorragend.

Gruß
Inspector
 
Zuletzt bearbeitet:
Hi,

es wird immer merkwürdiger. Ich habe mir jetzt mal den Elementnamen zu Debugzwecken mit ausgeben lassen:
PHP:
$xpath = new DOMXPath($xhtml);
$secondary = $xpath->query("//*[@id='secondary']")->item(0) or die("Error: No secondary found");
$secondary->appendChild($xhtml->createElement('p',$secondary->tagName));//DEBUG

Als Ergebnis wird mir tatsächlich "div" ausgegeben. Aber wenn ich den xpath Ausdruck vorne um eben diesen div ergänze:
PHP:
$xpath = new DOMXPath($xhtml);
$secondary = $xpath->query("//div[@id='secondary']")->item(0) or die("Error: No secondary found");
$secondary->appendChild($xhtml->createElement('p',$secondary->tagName));//DEBUG
Dann wird Nix gefunden, und ich bekomme die Fehlermeldung, die ich mir hier gesetzt habe.
 
Ich glaube, ich habe das Rätsel gelöst. Aber vielleicht kann ja einer der Fachleute hier das noch mal überprüfen.

Also, nach langer Suche bin ich auf bool registerNamespace ( string $prefix , string $namespaceURI ) gestoßen. Und dort heisst es weiter unten in den Kommentaren:
This is called prefix mapping and it is necessary to use xpath to handle documents which have default namespaces. //root/item will search for items with no namespace, not items with the namespace described as the default in the xmlns declaration. This problem is maddening as it just looks on the surface like xpath isn't working.

Tja, ein Problem, auf das ich auch schon mit xsl gestoßen bin. Daben kann man, wie bei xsl, allerdings keinen leeren Prefix "registrieren". Folglich habe ich das Gleiche gemacht wie in den xsl-Dateien:
PHP:
$xhtml = new DOMDocument;
$xhtml->load('newblog.xhtml');
$xpath = new DOMXPath($xhtml);
$xpath->registerNamespace('h','http://www.w3.org/1999/xhtml');
$secondary = $xpath->query("//h:div[@id='secondary']")->item(0) or die("Error: No secondary found");
$secondary->appendChild($xhtml->createElement('p',$secondary->nodeName)); //DEBUG
Das ist das Gleiche wie im Kopf meiner xsl-Dateien (Auszug):
PHP:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" 
	xmlns		= "http://www.w3.org/1999/xhtml"
	xmlns:h		= "http://www.w3.org/1999/xhtml"
	xmlns:xsl	= "http://www.w3.org/1999/XSL/Transform"
	xmlns:rdf	= "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:rss	= "http://purl.org/rss/1.0/"
	xmlns:dc	= "http://purl.org/dc/elements/1.0/"
	xmlns:dcterms	= "http://purl.org/dc/terms/"
	exclude-result-prefixes="xsl h">
Ist etwas kompliziert, und mir schwirrt etwas der Kopf dabei, aber wenn man sich strikt an das Schema hält, klappt es. Aber, wie gesagt, eine Überprüfung durch die Fachleute hier wäre mir schon ganz lieb, schließlich bin ich php Anfänger :)
 
Zurück