Чтобы упростить оператор проблемы, я пытаюсь выполнить поиск и проверить, присутствует ли какой-либо элемент в моем файле. Мой XML файл - это файл AndroidManifest.xml, используемый в приложениях Android. В частности, я ищу элемент типа "uses-permission" с именем элемента "android: name" и значением "android.permission.INTERNET". Достаточно просто, не так ли?
Запрос состоит в том,
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>
Вы можете использовать XNamespace
для представления префикса пространства имен и использовать локальное имя XNamespace
+attribute для указания атрибута в пространстве имен:
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;
При использовании методов LINQ to XML вам нужно использовать объекты XName
при попытке найти объекты с определенными пространствами имен.
Проще говоря, объявления пространства имен XName
истинное XName
XElement
или XAttribute
в структуре данных LINQ to XML.
XName
- это просто конструкция вокруг {<namespace>}<object name>
Так что вы должны искать в своем .Attribute()
метода .Attribute()
не "android:name"
а "{http://schemas.android.com/apk/res/android}name"