В чем разница между DOMXPath::evaluate и DOMXPath::query?

пытаясь решить, что больше подходит для моего варианта использования...

после сравнения документации для этих методов, мое смутное понимание evaluate возвращает типизированный результат, но query не делает. Кроме того,query пример включает в себя цикл через многие результаты, но evaluate пример предполагает один типизированный результат.

все еще не намного мудрее! Может кто-нибудь объяснить (как условия непрофессионала), когда вы будете использовать один или другой - например, всегда ли будут иметь место множественные/одиночные результаты, упомянутые выше?

2 ответов


DOMXPath:: query() поддерживает только выражения, возвращающие список узлов. DOMXPath:: evaluate() поддерживает все допустимые выражения. Официальный метод также называется evaluate ():http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator

выделить все p элементы внутри div: //div//p

выделить все href атрибуты a элементы текущего документа: //a/@href

можно использовать


query вернет DOMNodeList независимо от вашего фактического выражения XPath. Это говорит о том, что вы не знаете, каким может быть результат. Таким образом, вы можете перебирать список и проверять узел типа узлов и сделать что-то на основе типа.

но query не ограничивается этим случаем использования. Вы все еще можете использовать это, когда вы знаете, какой тип вы получите. Это может быть более читаемым в будущем, что вы хотели достичь и, следовательно, легче поддерживать.

evaluate С другой стороны дает вам именно тот тип, который вы выберите. Как показывают примеры:

$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); // "false"

как оказалось выбрав атрибуты //div/@id или текстовые узлы //div/text() по-прежнему дает DOMNodeList вместо струн. Таким образом, потенциальные варианты использования ограничены. Вам придется заключить их в string: string(//div/@id) или текстовые узлы string(//div/text()).

главные преимущества evaluate это то, что вы можете получить строки из вашего DOMDocument меньше строки программного кода. В противном случае он будет производить тот же результат, что и query.

на это правильно, что некоторые выражения не будут работать с query:

$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id