Dans Xpath, je souhaite sélectionner des éléments d’une valeur spécifique.
Exemple de données XML:
<aaa id="11" >
<aaa id="21" >
<aaa id="31" ></aaa>
<bbb id="32" >
<aaa id="41" ></aaa>
<bbb id="42" ></bbb>
<ccc id="43" ></ccc>
<ddd id="44" >qwerty</ddd>
<ddd id="45" ></ddd>
<ddd id="46" ></ddd>
</bbb>
</aaa>
<bbb id="22" >
<aaa id="33" >qwerty</aaa>
<bbb id="34" ></bbb>
<ccc id="35" ></ccc>
<ddd id="36" ></ddd>
<ddd id="37" ></ddd>
<ddd id="38" ></ddd>
</bbb>
<ccc id="23" >qwerty</ccc>
<ccc id="24" ></ccc>
</aaa>
Maintenant, en utilisant le XPath:
//ccc[.='qwerty']
Je reçois les résultats corrects attendus :
Name Value
ccc qwerty
Maintenant, en utilisant le XPath:
//aaa[.='qwerty']
J'obtiens des résultats inattendus :
Name Value
aaa
aaa qwerty
Et ce qui m'intéresse particulièrement, c'est comment sélectionner un élément quelconque avec cette valeur
XPath:
//*[.='qwerty']
Je reçois des résultats très étranges inattendus :
Name Value
aaa
bbb
ddd qwerty
bbb qwerty
aaa qwerty
ccc qwerty
Quelqu'un peut-il expliquer ces résultats et comment corriger les expressions XPath afin d'obtenir davantage de résultats attendus?
La spécification XPath définit la valeur de la chaîne d'un élément comme la concaténation (dans l'ordre du document) de tous ses descendants de nœuds de texte.
Ceci explique les "résultats étranges".
Les "meilleurs" résultats peuvent être obtenus en utilisant les expressions ci-dessous:
//*[text() = 'qwerty']
Ce qui précède sélectionne chaque élément du document ayant au moins un enfant de noeud de texte avec la valeur 'qwerty'.
//*[text() = 'qwerty' and not(text()[2])]
Ce qui précède sélectionne tous les éléments du document qui n’ont qu’un seul enfant de noeud de texte et dont la valeur est: 'qwerty'.
Essayer
//*[text()='qwerty']
parce que .
est votre élément actuel