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
//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
.
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
.
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"
//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.
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 ().
@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
pour tout XML avec un espace de noms, utilisez local-name ()
//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name