我正在使用dom4j来解析AndroidManifestFile.xml。但是我发现它奇怪地对待“android:xxx”属性。
例如:
<receiver android:name="ProcessOutgoingCallTest" android:exported="false"
android:enabled="false">
<intent-filter android:priority="1">
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
返回值e.attributeValue("android:exported")
将是null
但是使用e.attributeValue("exported")
将获得正确的字符串(但我不喜欢这种方式,因为它可能比预期更匹配)。同时,e.attributeValue(new QName("android:exported"))
仍然是一个空字符串。
获取属性
的正确方法是什么答案 0 :(得分:2)
android:
只不过是XML中的namespace
。
如果只有一个可能的命名空间,可以写e.attributeValue("exported")
。
QName表示XML元素或属性的限定名称值。它由本地名称和命名空间实例
组成
QName(String name)
QName(String name, Namespace namespace)
QName(String name, Namespace namespace, String qualifiedName)
因此,new QName("android:exported")
是错误的,正确的形式是
new QName("exported", new Namespace("android", "http://schemas.android.com/apk/res/android"))
如果您在此处错过了其命名空间,则默认为NO_NAMESPACE
。
public QName(String name) {
this(name, Namespace.NO_NAMESPACE);
}
示例:
Element root = document.getRootElement();
Namespace namespace = new Namespace("android", "http://schemas.android.com/apk/res/android");
for(Iterator i = root.elementIterator("receiver"); i.hasNext();)
{
Element e = (Element)i.next();
System.out.println(e.attributeValue("exported"));
System.out.println(e.attributeValue(new QName("exported", namespace)));
}