Qual è XPath corretto per la scelta degli attributi che contengono & # 8220; foo & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

Domanda

Dato questo XML, ciò che XPath restituisce tutti gli elementi il ??cui attributo prop contiene Foo (i primi tre nodi):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
È stato utile?

Soluzione

//a[contains(@prop,'Foo')]

Funziona se uso questo XML per ottenere risultati.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Modifica: Un'altra cosa da notare è che mentre XPath sopra restituirà la risposta corretta per quel particolare xml, se vuoi garantire di ottenere solo il " a " elementi nell'elemento "bla", dovresti usare come altri

/bla/a[contains(@prop,'Foo')]

Questo ti cercherà tutti " a " elementi nell'intero documento XML, indipendentemente dal fatto che siano nidificati in un "blah" elemento

//a[contains(@prop,'Foo')]  

L'ho aggiunto per completezza e nello spirito di StackOverflow. :)

Altri suggerimenti

Questo XPath ti darà tutti i nodi che hanno attributi contenenti 'Foo' indipendentemente dal nome del nodo o dal nome dell'attributo:

//attribute::*[contains(., 'Foo')]/..

Naturalmente, se sei più interessato al contenuto dell'attributo stesso, e non necessariamente al loro nodo genitore, lascia cadere il / ..

//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]

o

/bla/a[contains(@prop,'Foo')]

o

/bla/a[position() <= 3]

Dissected:

descendant-or-self::

L'Asse: cerca in ogni nodo sottostante e nel nodo stesso. Spesso è meglio dire questo che //. Ho riscontrato alcune implementazioni in cui // significa ovunque (decente o sé del nodo radice). L'altro utilizza l'asse predefinito.

* or /bla/a

Il tag - una corrispondenza jolly e / bla / a è un percorso assoluto.

[contains(@prop,'Foo')] or [position() <= 3]

La condizione in []. @prop è una scorciatoia per attributo :: prop, poiché l'attributo è un altro asse di ricerca. In alternativa puoi selezionare i primi 3 usando la funzione position ().

John C è il più vicino, ma XPath distingue tra maiuscole e minuscole, quindi XPath corretto sarebbe:

/bla/a[contains(@prop, 'Foo')]

Hai provato qualcosa del tipo:

// a [contiene (@prop, " Foo ")]

Non ho mai usato prima la funzione contiene ma sospetto che dovrebbe funzionare come pubblicizzato ...

Se devi anche abbinare il contenuto del link stesso, usa text ():

// a [contiene (@ href, " / some_link ")] [text () = " Fai clic qui "]

/ bla / a [contiene (@prop, " foo ")]

Per il codice sopra ... // * [contiene (@ prop, 'foo')]

prova questo:

// un [contiene (@ prop, 'pippo')]

che dovrebbe funzionare per qualsiasi " a " tag nel documento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top