web-dev-qa-db-fra.com

Extraire la valeur du noeud d'attribut via XPath

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

Un exemple de fichier XML est:

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

Jusqu'ici j'ai cette chaîne XPath:

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

Il ne renvoie que des éléments child, mais j'aimerais avoir la valeur de l'attribut name.

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

Child_2
Child_4
Child_1
Child_3
241
Rehman
//Parent[@id='1']/Children/child/@name 

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

314
lweller

Pour obtenir uniquement la valeur (sans nom d'attribut), utilisez string():

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

La fonction fn: string () renverra la valeur de son argument sous la forme xs:string. Si son argument est un attribut, il renverra donc la valeur de l'attribut sous la forme xs:string.

130
acdcjunior

Comme répondu ci-dessus:

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

affichera uniquement l'attribut name des 4 nœuds child appartenant au Parent spécifié par son prédicat [@id=1]. Vous devrez ensuite changer le prédicat en [@id=2] pour obtenir l'ensemble des nœuds child pour le prochain Parent.

Cependant, si vous ignorez le noeud Parent et utilisez:

//child/@name

vous pouvez sélectionner l'attribut name de tous les nœuds child en une 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"
6
Vinod Srivastav
//Parent/Children[@  Attribute='value']/@Attribute

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

5
Akshay Dubey

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

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

5

@ryenus, vous devez parcourir le résultat. Voici comment je le ferais dans vbscript;

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.setProperty "SelectionLanguage", "XPath"
xmlDoc.load("kids.xml")

'Remove the id=1 attribute on Parent to return all child names for all Parent nodes
For Each c In xmlDoc.selectNodes ("//Parent[@id='1']/Children/child/@name")
    Wscript.Echo c.text
Next
1
NickC

pour tout XML avec un espace de noms, utilisez local-name ()

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
0
metal