具有限定名称的dom4j attributeValue

时间:2015-11-20 05:17:23

标签: java android xml dom4j

我正在使用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 个答案:

答案 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)));
        }