327 votes

Extraire la valeur d'un nœud d'attribut via XPath

Comment extraire la valeur d'un nœud d'attribut via XPath ?

Voici un exemple de fichier XML :

<parents name='Parents'>
  <Parent id='1' name='Parent_1'>
    <Children name='Children'>
      <child name='Child_2' id='2'>child2_Parent_1</child>
      <child name='Child_4' id='4'>child4_Parent_1</child>
      <child name='Child_1' id='3'>child1_Parent_1</child>
      <child name='Child_3' id='1'>child3_Parent_1</child>
    </Children>
  </Parent>
  <Parent id='2' name='Parent_2'>
    <Children name='Children'>
      <child name='Child_1' id='8'>child1_parent2</child>
      <child name='Child_2' id='7'>child2_parent2</child>
      <child name='Child_4' id='6'>child4_parent2</child>
      <child name='Child_3' id='5'>child3_parent2</child>
    </Children>
  </Parent>
</parents>

Pour l'instant, j'ai cette chaîne XPath :

//Parent[@id='1']/Children/child[@name]  

Il ne renvoie que child mais j'aimerais que la valeur de l'élément name attribut.

Pour mon exemple de fichier XML, voici ce que j'aimerais que le résultat soit :

Child_2
Child_4
Child_1
Child_3

0 votes

415voto

lweller Points 5252
//Parent[@id='1']/Children/child/@name 

Votre original child[@name] désigne un élément child qui a un attribut name . Vous voulez child/@name .

180voto

acdcjunior Points 19898

Pour obtenir uniquement la valeur (sans les noms des attributs), utilisez string() :

**string(**//Parent[@id='1']/Children/child/@name**)**

El fn:string() retournera la valeur de son argument en tant que xs:string . Dans le cas où son argument est un attribut, il retournera donc la valeur de l'attribut en tant que xs:string .

1 votes

Avec xqilla il était nécessaire d'appeler xs:string . Je me demande pourquoi.

1 votes

@krlmlr Probablement xs est le préfixe de l'espace de nom pour les fonctions XPath. Ainsi, elles ne sont pas mélangées avec d'autres.

7 votes

LOL. C'est la seule réponse qui répond réellement à la question. +1

10voto

VinodSrivastav Points 1

Comme répondu ci-dessus :

//Parent[@id='1']/Children/child/@name 

ne produira que le name attribut de la 4 child les nœuds appartenant à la Parent spécifié par son prédicat [@id=1] . Vous devrez ensuite modifier le prédicat en [@id=2] pour obtenir l'ensemble des child pour le prochain Parent .

Cependant, si vous ignorez le Parent de l'ensemble du nœud et de son utilisation :

//child/@name

vous pouvez sélectionner name attribut de tous les child nœuds en une seule fois.

name="Child_2"
name="Child_4"
name="Child_1"
name="Child_3"
name="Child_1"
name="Child_2"
name="Child_4"
name="Child_3"

8voto

Vous devez utiliser //Parent[@id='1']/Children/child/data(@name)

Les attributs ne peuvent pas être sérialisés et vous ne pouvez donc pas les renvoyer dans un résultat ressemblant à du xml. Ce que vous devez faire, c'est obtenir les données de l'attribut en utilisant la fonction data().

6voto

Akshay Dubey Points 71
//Parent/Children[@  Attribute='value']/@Attribute

C'est le cas qui peut être utilisé lorsque l'élément a 2 attributs et que nous pouvons obtenir un attribut à l'aide d'un autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X