Xpath за избор на стойност на братски атрибут с пространство от имена

Мъча се да дефинирам 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