Xpath для выбора значения атрибута sibling с пространством имен

Я изо всех сил пытаюсь определить XPath для возврата значения uniqueappversionid из следующего XML:

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


person Marty Pitt    schedule 01.04.2011    source источник


Ответы (3)


С префиксом a, привязанным к пространству имен http://schemas.android.com/apk/res/android:

/manifest
   /application
      /meta-data[@a:name='uniqueappversionid']
         /@a:value
person Community    schedule 01.04.2011
comment
Я использовал /manifest/application/meta-data[@android:name='uniqueappversionid']/@android:value без какой-либо привязки, что в основном делает то же самое. - person Aaron D; 03.07.2014

Хорошо, возможно, есть лучший подход, но это то, что я в итоге использовал:

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

Я был бы очень признателен за предложения по улучшению этого!

person Marty Pitt    schedule 01.04.2011
comment
Никогда не используйте позиционные предикаты для атрибутов. Парсеры XML не обязаны сохранять исходный порядок. - person ; 02.04.2011
comment
Было бы лучше //meta-data[@*='uniqueappversionid']/@*[.!='uniqueappversionid'] - person ; 02.04.2011
comment
Короче: //@*[.='uniqueappversionid']/../@*[. != 'uniqueappversionid'] - person Dimitre Novatchev; 03.04.2011

Ваш вопрос имеет отношение как к структуре, в которой вы выполняете свой запрос 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>

Средством настройки пространства имен здесь являются атрибуты xmlns в элементах XSLT, в которые вложен запрос XPath. В типичной среде императивного языка программирования вам, скорее всего, придется устанавливать псевдонимы пространств имен посредством параметризации объекта (объектов) XML, по которым вы оцениваете запрос. Чтобы указать ответ для такой среды, вам нужно уточнить структуру XML.

person Jollymorphic    schedule 01.04.2011