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

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

最佳答案

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

关于java - 具有限定名称的dom4j attributeValue,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33819504/

10-10 09:42