LINQ to XML: поиск элемента с определенным атрибутом

1

Чтобы упростить оператор проблемы, я пытаюсь выполнить поиск и проверить, присутствует ли какой-либо элемент в моем файле. Мой 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>
Теги:
linq
linq-to-xml
xml-namespaces

2 ответа

2
Лучший ответ

Вы можете использовать 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;
1

При использовании методов 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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню