2014-08-24 4 views
1

Чтобы упростить инструкцию по проблеме, я пытаюсь выполнить поиск и посмотреть, присутствует ли какой-либо элемент в моем файле. Мой XML-файл - это файл AndroidManifest.xml, используемый в приложениях Android. В частности, я ищу элемент типа «uses-permission» с именем элемента «android: name» и значением «android.permission.INTERNET». Достаточно просто, не так ли?LINQ to XML: Поиск элемента с определенным атрибутом

Этот запрос,

IEnumerable<XElement> address = 
    from el in _rootElement.Elements("uses-permission") 
     where (string)el.Attribute("android:name") == "android.permission.INTERNET" 
     select el; 

Вопрос заключается в том, что пространство имен, как и в «андроид: имя» не может быть использован в запросе. Итак, как мне сделать этот запрос? Я видел некоторые жалобы и предложения в другом месте, но не могу включить их в свой конкретный запрос.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.app.myapp"> 

<uses-permission android:name="android.permission.INTERNET"/> 

    <application android:allowBackup="true" android:icon="@drawable/app_icon" android:label="App"> 

     <activity android:configChanges="fontScale|keyboard|keyboardHidden" android:name="com.unity3d.player.UnityPlayerProxyActivity" android:screenOrientation="landscape"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+1

Возможный дубликат [Gett значение атрибута в пространстве имен] (http://stackoverflow.com/questions/15096621/getting-value-of-an-attribute-within-namespace) –

ответ

2

Вы можете использовать XNamespace представлять префикс пространства имен, а также использовать XNamespace + Локальное имя атрибута указывает на атрибут в пространстве имен:

XNamespace ns = "http://schemas.android.com/apk/res/android"; 
IEnumerable<XElement> address = 
      from el in doc.Root.Elements("uses-permission") 
      where (string)el.Attribute(ns+"name") == "android.permission.INTERNET" 
      select el; 
1

Вы должны использовать XName объекты при попытке найти объекты с определенными пространствами имен при использовании LINQ к XML методов.

Проще говоря, объявления пространств имен обфускают истинные XNameXElement или XAttribute в структуре данных LINQ to XML.

XName просто конструкция вокруг {<namespace>}<object name>

Так что вы должны искать в вашем .Attribute() вызова метода не "android:name" но "{http://schemas.android.com/apk/res/android}name"

Смежные вопросы