2013-05-03 21 views
8

Jedynym sposobem, wiem, w PHP wykonywać kwerendy XPath w DOM jest DOMXPath, ze działa tylko na DOMDocument:Wyszukiwanie przez XPath w ramach danego elementu

public __construct (DOMDocument $doc) 

Czy istnieje podobny mechanizm do wyszukiwania w porównaniu do DOMElement?

Problem polega na tym, że muszę przeszukać abritrary XPath (którego nie kontroluję) w stosunku do DOMElement.

Próbowałem zrobić:

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

Ale jeśli XPath zawiera | (lub znaków), podejście to nie działa.

+0

Myślę, że to jest coś, co lubisz: http://querypath.org/ Jest to jedyny sposób, w jaki manipuluję DOM w php. Jest bardzo schludny;) – Twisted1919

+0

Znam QueryPath, ale chciałbym go uniknąć, jeśli można to zrobić tylko z wbudowanym DOM. – Benjamin

+0

QueryPath używa PHP SimpleXML, więc jest w porządku, używaj go. – Twisted1919

Odpowiedz

15

Tak, jest. Element jest także częścią dokumentu, więc używasz obiektu xpath dokumentu, ale gdy uruchomisz zapytanie, istnieje drugi parametr, który jest węzłem kontekstu, do którego zapytanie w pierwszym parametrze jest powiązane z:

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

Zobacz DOMXpath::query().

+1

@Benjamin: Nie ma problemu, są pewne połowy, ścieżka powinna być względna, dlatego umieszczam kropkę na wierzchu. Powinien dobrze zacząć od kontekstowych zapytań xpath. W SimpleXML jest automatycznie względny do elementu, w którym wywołana jest metoda xpath. – hakre

+0

To powinno być w porządku, w większości używam wyrażeń XPath pochodzących z biblioteki CSS-selektor-do-XPath, które w zasadzie wszystkie zaczynają się od czegoś podobnego do 'potomka-lub-siebie ::' – Benjamin

+0

@Hakre my dear friend ** ścieżka powinna być napisana względnie ** jest to stwierdzenie, którego szukałem i jest naprawdę ważne! Byłem tak zdezorientowany, dlaczego zawsze otrzymuję wszystkie elementy, kiedy używam czegoś takiego jak '// div [@ class = 'some row']' i teraz wiem, że aby wyszukać w konkretnej ** DOMElement ** musisz określić względną ścieżka taka jak './div[@class=some row ']'. Dzięki ! – codtex

Powiązane problemy