使用带有限定名称的dom4j attributeValue

3
我是使用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"))仍然是一个空字符串。

获取属性的正确方式是什么?

1个回答

2

android:只是XML中的一个命名空间。

如果只有可能存在一个命名空间,可以写成 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)));
        }

是因为在典型的AndroidManifest.xml中定义了"xmlns:android="http://schemas.android.com/apk/res/android"吗? - Hongxu Chen
是的,您只需要考虑如何使用QName和命名空间相关的内容。 - chenzhongpu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接