XPath: Obtenir nœud parent du nœud enfant
J'ai besoin d'obtenir le nœud parent pour l'enfant nœud "title 50"
En ce moment je suis en utilisant uniquement
//*[title="50"]
Comment pourrais-je obtenir de ses parents?
Le résultat doit être le store
nœud.
<?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>
Vous devez vous connecter pour publier un commentaire.
Utiliser le
parent
axes avec le parent du nœud nom.Ce XPath ne sélectionnez le nœud parent si c'est un
store
.Mais vous pouvez également utiliser l'un de ces
Ces requêtes xpath sera sélectionnez n'importe quel nœud parent. Donc, si le document est modifié, vous devez toujours sélectionner un nœud, même si ce n'est pas le nœud que vous attendez.
MODIFIER
Non, il ne sélectionne le magasin si c'est un parent du nœud qui correspond à
//*[title="50"]
.Oui, vous pouvez utiliser
ancestor
axesCela va sélectionner tous les ancêtres du nœud correspondant
//*[title="50"]
que sont les magasins. E. g.parent::*
syntaxe abrégée..
(exemple://*[title="50"]/..
) ou d'un ensemble de prédicat (exemple://*[*[title="50"]]
)parent::node()
qui correspond au raccourci..
et est mieux à mon avis. En faitparent::*
est limitée au type de nœud principal de l'axe qui, dans la plupart des cas, n'est pas un problème..xpath('..')
ouxpath('parent::node()')
bicycle
mais le parent du parent eststore
? Est-il de l'ascension? Si non, est-il une méthode pour l'ascension dans de tels cas et retourNone
si il n'y a pas de tels parents?ancestor::
pour résoudre ma tâcheJuste comme alternative, vous pouvez utiliser
ancestor
.Il est plus puissant que
parent
, car il peut même le grand-parent ou arrière grand-grands-parentsVous pouvez utiliser les deux points à la fin de l'expression, trop. Voir cet exemple:
Nouveau, l'amélioration de la réponse à une vieille question fréquemment posée...
Utiliser un prédicat plutôt que de la
parent::
ouancestor::
axePlus de réponses ici, sélectionnez la
title
puis traverser jusqu'à l'cibléesstore
élément. Plus simple, l'approche directe consiste à sélectionner lestore
élément directement à la première place, ce qui évite de traverser uneparent::
ouancestor::
:Devrait intervenir des éléments varient en nom:
Ou, dans le nom et la profondeur:
Cela fonctionne dans mon cas. J'espère que vous pouvez extraire le sens hors de lui.