J'ai besoin d'obtenir le noeud parent pour le noeud enfant "titre 50"
Pour le moment, je n'utilise que
//*[title="50"]
Comment pourrais-je obtenir son parent? Le résultat devrait être le noeud store
.
<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
<store d:mi="22">
<book price="12.99" d:price="Number" d:mi="4">
<title d:constr="String" d:mi="1">Sword of Honour</title>
<category d:constr="String" d:mi="2">fiction</category>
<author d:constr="String" d:mi="3">Evelyn Waugh</author>
</book>
<book price="8.99" d:price="Number" d:mi="9">
<title d:constr="String" d:mi="5">Moby Dick</title>
<category d:constr="String" d:mi="6">fiction</category>
<author d:constr="String" d:mi="7">Herman Melville</author>
<isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
</book>
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
<book price="22.99" d:price="Number" d:mi="18">
<title d:constr="String" d:mi="14">The Lord of the Rings</title>
<category d:constr="String" d:mi="15">fiction</category>
<author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
<isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
</book>
<bicycle price="19.95" d:price="Number" d:mi="21">
<brand d:constr="String" d:mi="19">Cannondale</brand>
<color d:constr="String" d:mi="20">red</color>
</bicycle>
</store>
</d:data>
Utilisez les axes parent
avec le nom du nœud parent.
//*[title="50"]/parent::store
Ce XPath ne sélectionnera le nœud parent que s'il s'agit d'une store
.
Mais vous pouvez aussi utiliser l'un de ces
//*[title="50"]/parent::*
//*[title="50"]/..
Ces xpaths sélectionneront n'importe quel nœud parent. Ainsi, si le document change, vous sélectionnerez toujours un nœud, même s'il ne s'agit pas du nœud attendu.
MODIFIER
Que se passe-t-il dans l'exemple donné où le parent est une bicyclette alors que le parent du parent est un magasin?
Est-ce qu'il monte?
Non, le magasin n'est sélectionné que s'il s'agit d'un parent du nœud qui correspond à //*[title="50"]
.
Dans le cas contraire, existe-t-il une méthode permettant de faire l'ascension dans de tels cas et de renvoyer Aucune si aucun parent n'existe?
Oui, vous pouvez utiliser les axes ancestor
//*[title="50"]/ancestor::store
Cela sélectionnera tous les ancêtres du nœud correspondant à //*[title="50"]
qui sont store
s. Par exemple.
<data xmlns:d="defiant-namespace" d:mi="23">
<store mi="1">
<store mi="22">
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
</store>
</store>
</data>
À titre d'alternative, vous pouvez utiliser ancestor
.
//*[title="50"]/ancestor::store
Il est plus puissant que parent
puisqu'il peut même recevoir le grand-parent ou l'arrière-arrière grand-parent
Vous pouvez également utiliser les deux points à la fin de l'expression. Voir cet exemple:
//*[title="50"]/..
Cela fonctionne dans mon cas. J'espère que vous pourrez en extraire le sens.
//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']