2015-11-20 4 views
3

Я использую dom4j для анализа AndroidManifestFile.xml. Однако я обнаружил, что он относится к атрибуту «android: xxx» странно.dom4j attributeValue с квалифицированным именем

Например:

<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")) по-прежнему будет пустой строкой.

Что правильный путь, чтобы получить атрибут

ответ

2

android: не более чем namespace в 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))); 
     } 
+0

это потому, что "XMLNS: андроид =" http://schemas.android.com/apk/res/android»определяется в типичном AndroidManifest.xml –

+0

Да Вам нужно только подумать о том, как использовать вещи, связанные с QName и пространством имен. – chenzhongpu