2013-05-03 16 views
8

L'unico modo che conosco in PHP per eseguire una query XPath sul DOM è DOMXPath, con funziona solo su un DOMDocument:Ricerca per XPath sotto un dato elemento

public __construct (DOMDocument $doc) 

Esiste un meccanismo simile per la ricerca relativamente a DOMElement?

Il problema è che ho bisogno di cercare un XPath abritrario (che non ho controllo su) relativamente a DOMElement.

Ho provato a fare:

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

Ma se l'XPath contiene una | (o carattere), questo approccio non funziona.

+0

Penso che questo sia qualcosa che ti piacerà: http://querypath.org/ È l'unico modo che uso per manipolare il DOM in PHP. È molto pulito;) – Twisted1919

+0

Conosco QueryPath, ma mi piacerebbe evitare di usarlo se è possibile farlo solo con il DOM integrato. – Benjamin

+0

QueryPath utilizza il SimpleXML di PHP, quindi va bene, vai avanti e usalo. – Twisted1919

risposta

15

Sì, c'è. Anche l'elemento fa parte del documento, quindi si utilizza l'oggetto xpath del documento, ma quando si esegue la query, esiste un secondo parametro, ovvero il nodo di contesto a cui la query nel primo parametro è relativa:

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

Vedere DOMXpath::query().

+1

@ Benjamin: No problemo, ci sono alcune prese, il percorso dovrebbe essere scritto relativo, ecco perché ho messo il punto in primo piano. Dovresti darti un buon inizio con le query xpath basate sul contesto. In SimpleXML è automaticamente relativo all'elemento in cui viene richiamato il metodo xpath. – hakre

+0

Va bene, sto principalmente usando le espressioni XPath provenienti da una libreria CSS-selector-to-XPath, che fondamentalmente iniziano tutte con qualcosa come 'descendant-or-self ::' – Benjamin

+0

@hakre, mio ​​caro amico ** il percorso dovrebbe essere scritto relativo ** questa è l'affermazione che cercavo ed è davvero importante! Ero così confuso perché ottengo sempre tutti gli elementi quando uso qualcosa come // // div [@ class = 'some row'] 'e ora so che per cercare in uno specifico ** DOMElement ** devi specificare percorso come './div[@class='some riga ']'. Grazie ! – codtex

Problemi correlati