2013-05-03 2 views
8

Единственный способ я знаю, что в PHP, чтобы выполнить запрос XPath на DOM является DOMXPath, с работает только на DOMDocument:Поиск по XPath под данным элементом

public __construct (DOMDocument $doc) 

Есть ли подобный механизм поиска относительно DOMElement?

Проблема в том, что мне нужно искать abritrary XPath (что я не контролирую) относительно DOMElement.

Я попытался сделать:

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

Но если XPath содержит | (или характер), этот подход не работает.

+0

Я думаю, вам это понравится: http://querypath.org/ Это единственный способ использовать DOM в php. Это очень аккуратно;) – Twisted1919

+0

Я знаю QueryPath, но я бы хотел избежать его использования, если это возможно сделать только с встроенным DOM. – Benjamin

+0

QueryPath использует SimpleXML для PHP, так что все в порядке, идите и используйте его. – Twisted1919

ответ

15

Да, есть. Элемент также является частью документа, поэтому вы используете объект xpath документа, но при запуске запроса есть второй параметр, который является контекстным узлом, к которому запрос в первом параметре относится к:

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

См. DOMXpath::query().

+1

@Benjamin: Нет проблем, есть некоторые уловы, путь должен быть написан относительно, вот почему я поставил точку впереди. Должен дать вам хорошее начало с помощью запросов xpath на основе контекста. В SimpleXML он автоматически относится к элементу, в котором вызывается метод xpath. – hakre

+0

Это должно быть все в порядке, я в основном использую выражения XPath, поступающие из библиотеки CSS-selector-to-XPath, которые в основном все начинаются с чего-то вроде «потомок-сам»: – Benjamin

+0

@hakre мой дорогой друг ** путь должен быть записан относительным ** это утверждение, которое я искал, и это действительно важно! Я был настолько смущен, что всегда получаю все элементы, когда я использую что-то вроде '// div [@ class = 'some row']', и теперь я знаю, что для поиска в определенном ** DOMElement ** вам нужно указать относительный путь как './div[@class='some row ']'. Благодаря ! – codtex

Смежные вопросы