Como posso extrair o valor de um nó de atributo via XPath?
Um arquivo XML de amostra é:
<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>
Até agora eu tenho essa string XPath:
//Parent[@id='1']/Children/child[@name]
Ele retorna apenas child
elementos, mas eu gostaria de ter o valor do name
atributo.
Para o meu arquivo XML de amostra, eis o que eu gostaria que fosse a saída:
Child_2
Child_4
Child_1
Child_3
Respostas:
Seu original
child[@name]
significa um elementochild
que possui um atributoname
. Você querchild/@name
.fonte
Para obter apenas o valor (sem nomes de atributo), use
string()
:string(//Parent[@id='1']/Children/child/@name)
A função fn: string () retornará o valor de seu argumento como
xs:string
. Caso seu argumento seja um atributo, ele retornará o valor do atributo comoxs:string
.fonte
xqilla
isso foi necessário ligarxs:string
. Eu quero saber porque.xs
é o prefixo do namespace para as funções XPath. Então eles não estão confusos com os outros.Você deveria usar
//Parent[@id='1']/Children/child/data(@name)
Os atributos não podem ser serializados, portanto você não pode devolvê-los em um resultado com aparência de xml. O que você precisa fazer é obter os dados do atributo usando a função data ().
fonte
Como respondido acima:
produzirá apenas o
name
atributo dos 4child
nós pertencentes aoParent
especificado por seu predicado[@id=1]
. Você precisará alterar o predicado[@id=2]
para obter o conjunto dechild
nós para o próximoParent
.No entanto, se você ignorar
Parent
completamente o nó e usar:você pode selecionar o
name
atributo de todos oschild
nós de uma só vez.fonte
Este é o caso que pode ser usado em que o elemento possui 2 atributos e podemos obter um atributo com a ajuda de outro.
fonte
@ryenus, você precisa percorrer o resultado. É assim que eu faria em vbscript;
fonte
para todo xml com espaço para nome, use local-name ()
fonte