LINQ to XML:查找具有特定属性的元素

时间:2014-08-24 12:28:17

标签: c# xml linq linq-to-xml xml-namespaces

为了简化问题陈述,我试图搜索并查看我的文件中是否存在某个元素。我的XML文件是AndroidManifest.xml文件,用于Android应用程序。具体来说,我正在搜索类型"使用 - 权限"元素名称为" android:name"和值#34; android.permission.INTERNET"。很简单,对吧?

查询是,

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

问题是名称空间如&#34; android:name&#34;无法在查询中使用。那我该怎么做这个查询呢?我在其他地方看到了一些抱怨和建议,但无法将它们纳入我的具体查询中。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

在使用LINQ to XML方法时,在尝试查找具有特定命名空间的对象时,需要使用XName个对象。

简而言之,命名空间声明会混淆LINQ to XML数据结构中XNameXElement的真XAttribute

XName只是围绕{<namespace>}<object name>

的构造

那么您应该在.Attribute()方法调用中寻找的内容不是"android:name",而是"{http://schemas.android.com/apk/res/android}name"