Search code examples
phpdomxpathdomxpathevaluate

What is the difference between DOMXPath::evaluate and DOMXPath::query?


Trying to decide which is more appropriate for my use case...

After comparing the documentation for these methods, my vague understanding is evaluate returns a typed result but query doesn't. Furthermore, the query example includes looping through many results but the evaluate example assumes a single typed result.

Still not much the wiser! Could anyone explain (in as close as possible to layman's terms) when you would use one or the other - e.g. will the multiple/single results mentioned above always be the case?


Solution

  • DOMXPath::query() supports only expressions that return a node list. DOMXPath::evaluate() supports all valid expressions. The official method is named evaluate(), too: http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator

    Select all p elements inside a div: //div//p

    Select all href attributes in a elements the current document: //a/@href

    You can use the string() function to cast the first element of a node list to a string. This will not work with DOMXpath::query().

    Select the title text of a document: string(/html/head/title)

    There are other function and operators that will change the result type of an expression. But it is always unambiguous. You will always know what type the result is.