Étant donné ce XML, ce que XPath renvoie tous les éléments dont l'attribut prop
contient Foo
(les trois premiers nœuds):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
//a[contains(@prop,'Foo')]
Fonctionne si j'utilise ce XML pour obtenir des résultats.
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
Edit: Une autre chose à noter est que, bien que XPath ci-dessus renvoie la réponse correcte pour ce XML particulier, si vous voulez garantir que vous n’obtenez que les éléments "a" de l’élément "bla", vous devriez, comme d’autres l'ont déjà mentionné, utiliser
/bla/a[contains(@prop,'Foo')]
Cela vous cherchera tous les éléments "a" dans votre document XML entier, indépendamment de leur imbrication dans un élément "blah"
//a[contains(@prop,'Foo')]
J'ai ajouté ceci dans un souci de minutie et dans l'esprit du stackoverflow. :)
Ce XPath vous donnera tous les nœuds qui ont des attributs contenant "Foo" indépendamment du nom du nœud ou du nom de l'attribut:
//attribute::*[contains(., 'Foo')]/..
Bien sûr, si vous êtes plus intéressé par le contenu de l'attribut lui-même, et pas nécessairement son nœud parent, supprimez simplement le/..
//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]
Ou:
/bla/a[contains(@prop,'Foo')]
Ou:
/bla/a[position() <= 3]
Disséqué:
descendant-or-self::
The Axis - recherchez dans chaque noeud situé en dessous et dans le noeud lui-même. Il vaut souvent mieux dire cela que //. J'ai rencontré des implémentations où // signifie n'importe où (décroissant ou autonome du nœud racine). L'autre utilise l'axe par défaut.
* or /bla/a
La balise - une correspondance générique, et/bla/a est un chemin absolu.
[contains(@prop,'Foo')] or [position() <= 3]
La condition dans []. @prop est un raccourci pour attribut :: prop, car attribut est un autre axe de recherche. Vous pouvez également sélectionner les 3 premiers à l’aide de la fonction position ().
John C est le plus proche, mais XPath est sensible à la casse. Le XPath correct serait donc:
/bla/a[contains(@prop, 'Foo')]
Si vous devez également faire correspondre le contenu du lien lui-même, utilisez text ():
//a[contains(@href,"/some_link")][text()="Click here"]
Avez-vous essayé quelque chose comme:
// a [contient (@prop, "Foo")]
Je n'ai jamais utilisé la fonction contient auparavant, mais soupçonne que cela devrait fonctionner comme annoncé ...
/ bla/a [contient (@prop, "foo")]
Pour le code ci-dessus ... // * [contient (@ prop, 'foo')]
essaye ça:
// a [contient (@ prop, 'foo')]
cela devrait fonctionner pour toutes les balises "a" dans le document