2014-05-21 18 views
6

Cercando di decidere quale è più adatto per il mio caso d'uso ...Qual è la differenza tra DOMXPath :: evaluate e DOMXPath :: query?

Dopo aver confrontato la documentazione per questi metodi, la mia comprensione vaga è evaluate restituisce un risultato digitato ma query non lo fa. Inoltre, l'esempio query include il looping di molti risultati ma l'esempio evaluate presuppone un singolo risultato tipizzato.

Ancora non molto più saggio! Qualcuno potrebbe spiegare (nel modo più vicino possibile ai termini di un laico) quando useresti l'uno o l'altro - ad es. i risultati multipli/singoli citati sopra saranno sempre il caso?

risposta

7

DOMXPath :: query() supporta solo le espressioni che restituiscono un elenco dei nodi. DOMXPath :: evaluate() supporta tutte le espressioni valide. Il metodo ufficiale è chiamato a valutare(), anche: http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator

Selezionare tutti p gli elementi all'interno di una div: //div//p

Seleziona tutti href attributi a elementi del documento corrente: //a/@href

È possibile utilizzare il string() funzione per eseguire il cast del primo elemento di una lista di nodi su una stringa. Questo non funzionerà con DOMXpath :: query().

Selezionare il testo del titolo di un documento: string(/html/head/title)

ci sono altre funzioni e gli operatori che cambierà il tipo di risultato di un'espressione. Ma è sempre inequivocabile. Saprai sempre di che tipo è il risultato.

4

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