2011-01-29 23 views
188

Come posso estrarre il valore di un nodo di attributo tramite XPath?Estrai il valore del nodo attributo tramite XPath

Un file XML di esempio è:

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

Finora ho questa stringa XPath:

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

restituisce solo child elementi, ma mi piacerebbe avere il valore dell'attributo name .

Per il mio esempio di file XML, ecco cosa mi piacerebbe l'output di essere:

Child_2 
Child_4 
Child_1 
Child_3 
+0

Eventuali duplicati di [attributo ottenere utilizzando XPath] (http: // StackOverflow.it/questions/4531995/getting-attribute-using-xpath) – tripleee

risposta

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

L'originale child[@name] significa un elemento child, che ha un attributo name. Vuoi child/@name.

+13

Sono d'accordo, la domanda era come ottenere il valore dell'attributo – Vladtn

+3

E se volessi estrarre solo il valore/descrizione/dati presente tra i tag. ... –

1

@ryenus, è necessario scorrere il risultato. Questo è come lo farei in 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 
101

per ottenere solo il valore (senza nomi degli attributi), utilizzare string():

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

Il fn:string() fucntion restituirà il valore del suo argomento come xs:string. Nel caso in cui il suo argomento sia un attributo, restituirà quindi il valore dell'attributo come xs:string.

+1

Con 'xqilla' era necessario chiamare' xs: string'. Mi chiedo perché. – krlmlr

+1

@krlmlr Probabilmente 'xs' è il prefisso dello spazio dei nomi per le funzioni XPath. Quindi non sono confusi con gli altri. – acdcjunior

3
//Parent/Children[@ Attribute='value']/@Attribute 

Questo è il caso che può essere utilizzato dove l'elemento ha 2 attributi e possiamo ottenere l'attributo con l'aiuto di un altro.

5

Si dovrebbe usare //Parent[@id='1']/Children/child/data(@name)

Gli attributi non possono essere serializzati in modo non è possibile tornare a un risultato cercando xml. Quello che devi fare è ottenere i dati dall'attributo usando la funzione data().

+2

non funziona con 'xmllint' –

+0

non funziona con .net – toddmo

5

come risposta sopra:

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

sarà emesso solo l'attributo name dei 4 child nodi appartenenti al Parent specificato dal suo predicato [@ id = 1]. Dovrai quindi modificare il predicato su [@id=2] per ottenere il set di nodi child per il prossimo Parent.

Tuttavia, se si ignora il nodo Parent del tutto ed impiego:

//child/@name 

è possibile selezionare name attributo di tutti child nodi in un colpo solo.

name="Child_2" 
name="Child_4" 
name="Child_1" 
name="Child_3" 
name="Child_1" 
name="Child_2" 
name="Child_4" 
name="Child_3" 
Problemi correlati