为了简化问题陈述,我试图搜索并查看我的文件中是否存在某个元素。我的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>
答案 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数据结构中XName
或XElement
的真XAttribute
。
XName
只是围绕{<namespace>}<object name>
那么您应该在.Attribute()
方法调用中寻找的内容不是"android:name"
,而是"{http://schemas.android.com/apk/res/android}name"