2011-01-29 20 views
188

¿Cómo puedo extraer el valor de un nodo de atributo a través de XPath?Extraer el valor del nodo de atributo a través de XPath

Un archivo XML de ejemplo es:

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

Hasta ahora tengo esta cadena XPath:

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

sólo devuelve child elementos, pero me gustaría tener el valor del atributo name .

Para mi archivo XML de ejemplo, esto es lo que me gustaría que la salida sea:

Child_2 
Child_4 
Child_1 
Child_3 
+0

Posible duplicado de [Obtención de atributos mediante XPath] (http: // stackoverflow.com/questions/4531995/getting-attribute-using-xpath) – tripleee

Respuesta

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

El original child[@name] significa un elemento child que tiene un atributo name. Quiere child/@name.

+13

Acepto, la pregunta era cómo obtener el valor del atributo – Vladtn

+3

¿Qué ocurre si me gustaría extraer solo el valor/descripción/datos presentes entre las etiquetas? ... –

1

@ryenus, debe recorrer el resultado. Así es como lo haría en 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

para obtener sólo el valor (sin nombres de atributo), utilice string():

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

El fucntion fn:string() devolverá el valor de su argumento como xs:string. En caso de que su argumento sea un atributo, devolverá el valor del atributo como xs:string.

+1

Con 'xqilla' era necesario llamar a' xs: string'. Me pregunto porque. – krlmlr

+1

@krlmlr Probablemente 'xs' es el prefijo del espacio de nombres para las funciones XPath. Entonces ellos no están confundidos con otros. – acdcjunior

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

Este es el caso que se puede utilizar en el elemento 2 está teniendo atributo y podemos conseguir el atributo con la ayuda de otro.

5

Debe utilizar //Parent[@id='1']/Children/child/data(@name)

Los atributos no pueden ser serializados por lo que no se les puede volver en un resultado que mira XML. Lo que debe hacer es obtener los datos del atributo utilizando la función data().

+2

no funciona con 'xmllint' –

+0

no funciona con .net – toddmo

5

como respondida arriba:

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

simplemente muestra el atributo name de los 4 child nodos que pertenecen a la Parent especificado por su predicado [@ id = 1]. A continuación, deberá cambiar el predicado a [@id=2] para obtener el conjunto de nodos child para el próximo Parent.

Sin embargo, si se ignora por completo el nodo Parent y uso:

//child/@name 

puede seleccionar name atributo de todos los nodos child de una sola vez.

name="Child_2" 
name="Child_4" 
name="Child_1" 
name="Child_3" 
name="Child_1" 
name="Child_2" 
name="Child_4" 
name="Child_3" 
Cuestiones relacionadas