【问题标题】:LINQ to XML: Finding an element with a specific attributeLINQ to XML:查找具有特定属性的元素
【发布时间】:2014-08-24 12:28:16
【问题描述】:

为了简化问题陈述,我正在尝试搜索并查看我的文件中是否存在某个元素。我的 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;

问题是“android:name”中的命名空间不能在查询中使用。那么我该如何进行这个查询呢?我在其他地方看到了一些抱怨和建议,但无法将它们合并到我的具体查询中。

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

【问题讨论】:

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


【解决方案1】:

您可以使用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;

【讨论】:

    【解决方案2】:

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

    简单地说,命名空间声明混淆了 LINQ to XML 数据结构中 XElementXAttribute 的真实 XName

    XName 只是{&lt;namespace&gt;}&lt;object name&gt; 周围的构造

    所以你应该在.Attribute() 方法调用中寻找的不是"android:name",而是"{http://schemas.android.com/apk/res/android}name"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多