2013-05-03 15 views
8

Die einzige Art, wie ich in PHP kenne eine XPath-Abfrage auf dem DOM auszuführen ist DOMXPath, mit nur einem Werk DOMDocument:Suche nach XPath unter einem bestimmten Elemente

public __construct (DOMDocument $doc) 

Gibt es einen ähnlichen Mechanismus suchen relativ zu einem DOMElement?

Das Problem ist, ich muss einen rabrizierten XPath (den ich habe keine Kontrolle über) relativ zu einem DOMElement.

Ich habe versucht zu tun:

$domElement->getNodePath() . '/' . $xPath; 

Aber wenn der XPath ein | (oder Zeichen) enthält, ist dieser Ansatz nicht funktioniert.

+0

Ich denke, das ist etwas, das Sie mögen werden: http://querypath.org/ Es ist die einzige Möglichkeit, die ich verwende, um das DOM in PHP zu manipulieren. Es ist sehr ordentlich;) – Twisted1919

+0

Ich kenne QueryPath, aber ich möchte es vermeiden, wenn es nur mit dem eingebauten DOM möglich ist. – Benjamin

+0

QueryPath verwendet PHP SimpleXML, also ist es okay, mach weiter und benutze es. – Twisted1919

Antwort

15

Ja, es gibt. Das Element ist ebenfalls Teil des Dokuments. Sie verwenden also das Xpath-Objekt des Dokuments. Wenn Sie jedoch die Abfrage ausführen, gibt es einen zweiten Parameter, bei dem es sich um den Kontextknoten handelt, auf den sich die Abfrage im ersten Parameter bezieht:

// query all child-nodes of $domElement 
$result = $xpath->query('./*', $domElement); 

Siehe DOMXpath::query().

+1

@Benjamin: Kein Problem, es gibt einige Fänge, der Pfad sollte relativ geschrieben werden, deshalb lege ich den Punkt vor. Sollte Ihnen einen guten Start mit kontextbasierten XPath-Abfragen geben. In SimpleXML ist es automatisch relativ zu dem Element, an dem die xpath-Methode aufgerufen wird. – hakre

+0

Das sollte in Ordnung sein, ich benutze meistens XPath-Ausdrücke, die von einer CSS-Selector-zu-XPath-Bibliothek kommen, die im Grunde alle mit etwas anfangen, wie 'Nachfahre oder Selbst': – Benjamin

+0

@hakre mein lieber Freund ** der Pfad sollte relativ geschrieben werden ** das ist die Aussage, nach der ich gesucht habe und die wirklich wichtig ist! Ich war so verwirrt, dass ich immer alle Elemente erhalte, wenn ich etwas wie '// div [@ class = 'irgendeine Reihe']' verwende und jetzt weiß ich, dass man in einem bestimmten ** DOME-Element ** relativ angeben muss Pfad wie './div[@class=some row ']'. Vielen Dank ! – codtex

Verwandte Themen