В чем разница между 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