【问题标题】:dom4j attributeValue with qualified name具有限定名称的 dom4j 属性值
【发布时间】:2015-11-20 05:17:22
【问题描述】:

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

获取属性的正确方法是什么

【问题讨论】:

    标签: java android xml dom4j


    【解决方案1】:

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

    【讨论】:

    • 是不是因为在典型的AndroidManifest.xml中定义了“xmlns:android="schemas.android.com/apk/res/android"?
    • 是的。你只需要考虑如何使用QName和命名空间相关的东西。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-12-10
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多