web-dev-qa-db-fra.com

XPath: Obtenir le nœud parent du nœud enfant

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>
96
GibboK

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 stores. 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>

 XPath selection result

202
René Link

À 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

22
Aminah Nuraini

Vous pouvez également utiliser les deux points à la fin de l'expression. Voir cet exemple:

//*[title="50"]/..
6
phduarte

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']
0
Shivam Bharadwaj