Dans Xpath, je souhaite sélectionner des éléments qui correspondent à 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 XPath:
//ccc[.='qwerty']
J'obtiens les bons résultats attendus :
Name Value
ccc qwerty
Maintenant, en utilisant 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 n'importe quel élément avec cette valeur
XPath:
//*[.='qwerty']
J'obtiens des résultats inattendus très étranges :
Name Value
aaa
bbb
ddd qwerty
bbb qwerty
aaa qwerty
ccc qwerty
Quelqu'un peut-il expliquer ces résultats et comment corriger mes expressions XPath pour obtenir plus de résultats attendus?
. =
est différent de XPathtext() =
. Voir les nœuds de texte correspondants est différent des valeurs de chaîne correspondantes pour savoir pourquoi.Réponses:
La spécification XPath. définit la valeur de 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".
Des résultats "meilleurs" peuvent être obtenus en utilisant les expressions ci-dessous:
Ce qui précède sélectionne chaque élément du document qui a au moins un enfant de nœud de texte avec la valeur «qwerty».
Ce qui précède sélectionne chaque élément du document qui n'a qu'un seul enfant de nœud de texte et sa valeur est: 'qwerty'.
la source
text()
est l'un des tests de nœuds possibles dans XPath, ce qui signifie "est-ce un nœud de texte?". D' autres nodetests sontcomment()
,processing-instruction()
ou tout simplementnode()
.Essayer
//*[text()='qwerty']
parce que.
c'est ton élément actuella source