query
restituirà un valore DOMNodeList
indipendentemente dall'espressione XPath effettiva. Questo suggerisce che non si sa quale possa essere il risultato. Quindi puoi scorrere l'elenco e controllare lo node type dei nodi e fare qualcosa in base al tipo.
Ma query
non è limitato a questo caso d'uso. Puoi ancora usarlo quando sai che tipo otterrai. Potrebbe essere più leggibile in futuro ciò che si voleva ottenere e quindi più facile da mantenere.
evaluate
d'altra parte ti dà esattamente il tipo che si seleziona. Come dimostrano gli esempi sottolineano:
$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); // "false"
Come si scopre selezionando attributi //div/@id
o di testo i nodi //div/text()
rese ancora DOMNodeList
invece di stringhe. Quindi i potenziali casi d'uso sono limitati. Dovresti includerli in string
: string(//div/@id)
o nei nodi di testo string(//div/text())
.
Il vantaggio principale di evaluate
è che è possibile ottenere stringhe dal proprio DOMDocument
con meno righe di codice. Altrimenti produrrà la stessa uscita di query
.
ThW's answer è giusto che alcune espressioni non funzioneranno con query
:
$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id
fonte
2014-05-21 23:35:09