使用命名空间选择sibling属性值的Xpath

时间:2011-04-01 19:45:28

标签: xml xpath xml-namespaces

我正在努力让XPath定义为从以下XML返回uniqueappversionid的值:

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

更具体地说,我需要从android:value元素中获取meta-data属性的值,android:name等于uniqueappversionid

3 个答案:

答案 0 :(得分:3)

a前缀绑定到http://schemas.android.com/apk/res/android命名空间:

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

答案 1 :(得分:2)

好的,可能有更好的方法,但这就是我最终使用的方法:

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

我非常感谢有关改善这一点的建议!

答案 2 :(得分:0)

您的问题与执行XPath查询的框架一样,与XPath查询本身的内容有关。例如,以下是如何在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>

这里的命名空间设置方法是通过嵌套XPath查询的XSLT元素上的xmlns属性。在典型的命令式编程语言环境中,您可能更有可能必须通过参数化您要评估查询的XML对象来设置命名空间别名。要为这样的环境指定答案,您必须具体了解XML框架。