XPath: come selezionare gli elementi in base al loro valore?


221

Sono nuovo di usare XPath e questa potrebbe essere una domanda di base. Si prega di sopportare con me e aiutarmi a risolvere il problema. Ho un file XML come questo:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

Posso convalidare la presenza di un <Element>tag con:

// Elemento [@ attributo1 = "abc" e @ attributo2 = "xyz"]

Ora voglio anche controllare il valore del tag per la stringa "Data". Per raggiungere questo obiettivo mi è stato detto di usare:

// Elemento [@ attributo1 = "abc" e @ attributo2 = "xyz" e dati]

Quando uso l'espressione successiva ottengo il seguente errore:

Messaggio di errore dell'asserzione: nessun nodo abbinato //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Per favore, mi dia il tuo consiglio se l'espressione XPath che ho usato è valida. In caso contrario, quale sarà l'espressione XPath valida?

Risposte:


329

Le seguenti condizioni:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

verifica l'esistenza dell'elemento Data all'interno dell'elemento e non per il valore dell'elemento Data.

Invece puoi usare

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

Il motivo per cui aggiungo questa risposta è che voglio spiegare la relazione di .e text().

La prima cosa è quando si usano [], ci sono solo due tipi di dati:

  1. [number] per selezionare un nodo dal set di nodi
  2. [bool] per filtrare un set di nodi da un set di nodi

In questo caso, il valore viene valutato come booleano in base alla funzione boolean() e esiste una regola:

I filtri vengono sempre valutati rispetto a un contesto.

Quando è necessario confrontare text()o .con una stringa"Data" , usa prima la string()funzione per trasformarli in tipo stringa, poi ottiene un risultato booleano.

Ci sono due regole importanti su string():

  1. Il string() funzione converte un set di nodi in una stringa restituendo il valore di stringa del primo nodo nel set di nodi, che in alcuni casi può produrre risultati imprevisti.

    text()è il percorso relativo che restituisce un set di nodi contiene tutto il nodo di testo del nodo corrente (nodo di contesto), come ["Data"]. Quando viene valutato dastring(["Data"]) , restituirà il primo nodo del set di nodi, in modo da ottenere "Dati" solo quando nel set di nodi è presente solo un nodo di testo.

  2. Se vuoi il string() funzione concatena tutto il testo figlio, è necessario passare un singolo nodo anziché un set di nodi.

    Ad esempio, otteniamo un set di nodi ['a', 'b'], puoi passare lì il nodo genitore string(parent), questo tornerà 'ab', e string(.)nel tuo caso restituirà una stringa concatenata "Data".

In entrambi i casi otterrà lo stesso risultato solo quando è presente un nodo di testo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.