2011-04-01 17 views
5

estoy luchando para conseguir un XPath definida para devolver el valor de la uniqueappversionid de la siguiente XML:XPath para seleccionar el valor del atributo de hermanos con espacio de nombres

<?xml version="1.0" encoding="UTF-8"?> 
<manifest package="air.com.vzw.Foo" 
      android:versionCode="0" 
      android:versionName="0.0.0" 
      android:installLocation="auto" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 
    <application android:label="FooAIR"> 
     <meta-data android:name="autoOrients" android:value="true" /> 
     <meta-data android:name="fullScreen" android:value="false" /> 
     <meta-data android:name="uniqueappversionid" 
        android:value="b1e1bfa8-20b4-4724-a9c3-34b79bc50b8d" /> 
     <meta-data android:name="initialcontent" android:value="FooAIR.swf" /> 
    </application> 
</manifest> 

Más específicamente, que necesito para obtener el valor de el atributo android:value del elemento meta-data con un android:name igual a uniqueappversionid.

Respuesta

3

Con a prefijo de espacio de nombres con destino a http://schemas.android.com/apk/res/android:

/manifest 
    /application 
     /meta-data[@a:name='uniqueappversionid'] 
     /@a:value 
+0

Utilicé' ''/manifest/application/meta-data [@android: name = 'uniqueappversionid']/@ android: value''' sin enlazar nada, lo que básicamente logra lo mismo. –

2

Ok, es probable que haya un mejor enfoque, pero esto es lo que he terminado usando:

//meta-data[@*='uniqueappversionid']/@*[2] 

Le agradecería sugerencias para mejorar este!

+0

Nunca use predicados posicionales para los atributos. Los analizadores XML no tienen la obligación de preservar el orden de origen. –

+2

Sería mejor '// metadatos [@ * = 'uniqueappversionid']/@ * [.! = 'Uniqueappversionid']' –

+1

Más corto: '//@*[.='uniqueappversionid']/../ @ * [. ! = 'uniqueappversionid'] ' –

0

Su pregunta tiene tanto que ver con el marco en el que se está ejecutando la consulta XPath como con el contenido de la propia consulta XPath. Por ejemplo, he aquí cómo usted lo haría en XSLT:

<stylesheet version="1.0" 
      xmlns="http://www.w3.org/1999/XSL/Transform" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 
    <template match="/"> 
    <value-of select="//meta-data[@android:name = 'uniqueappversionid']/@android:value" /> 
    </template> 
</stylesheet> 

Los medios de configuración de espacio de nombres aquí es a través de los atributos xmlns en los elementos XSLT bajo el cual está anidada la consulta XPath. En un entorno de lenguaje de programación imperativo típico, es probable que tenga que configurar alias de espacio de nombres a través de la parametrización de los objetos XML en los que está evaluando la consulta. Para especificar una respuesta para dicho entorno, debe obtener información específica sobre el marco XML.

Cuestiones relacionadas