2017-03-14 51 views
1

希望你沒事。 我必須解析一個android清單文件來提取像'minSdkVersion'這樣的數據,在幾次使用JDOM之後我發現了一個代碼。 顯示與「uses-sdk」相關的數據是預期的,但在運行時我得到一個空對象。 需要幫助 感謝用JDOM2解析Android清單文件

艙單例

<?xml version="1.0" encoding="UTF-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.android.rssfeed" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="16" 
      android:targetSdkVersion="19" /> 

     <uses-permission android:name="android.permission.INTERNET" /> 

    </manifest> 

代碼

import java.io.File; 
import java.util.Iterator; 
import java.util.List; 
import org.jdom2.*; 
import org.jdom2.input.SAXBuilder; 

public class ManifestP2 { 

    static Document document; 
    static Element root; 
    static NeededTag tags;//Data receiver 

    public static void main(String[] args){ 
     SAXBuilder builder = new SAXBuilder(); 
     try{ 

      document = builder.build(new File("AndroidManifest.xml")); 

     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
     root = document.getRootElement(); 
     tags = new NeededTag(); 
     findTag(); 
     System.out.println(tags.usesSdk.toString()); 
    } 

    static void findTag(){ 
     //get values for "uses-sdk" tag  
     Element sdk = root.getChild("uses-sdk"); 
     tags.usesSdk.minSdk = sdk.getAttributeValue("android:minSdkVersion"); 
     tags.usesSdk.targetSdk = sdk.getAttributeValue("android:targetSdkVersion"); 

    } 
} 

回答

0

文檔中的屬性在android命名空間。 XML中的命名空間增加了複雜程度,這也是事實,但它們也確保您可以擁有特殊類型的文檔,如清單,您可以在同一文檔中將「元」類型的信息存儲爲常規數據,同時仍能保證不會有任何名稱衝突。

這是一種複雜的說法,在您的XML文檔中看到android的位置時,它指的是名稱空間,而不是屬性名稱。

因此,例如,當您有:

<uses-sdk 
     android:minSdkVersion="16" 
     android:targetSdkVersion="19" /> 

真的意味着你有你自己的元素uses-sdk和元素有兩個屬性,一個叫minSdkVersion,另一種叫targetSdkVersion。這些屬性位於具有URI的名稱空間中:http://schemas.android.com/apk/res/android

要從JDOM中的元素中獲取這些屬性,您必須通過名稱和正確的名稱空間請求它們。

要做到這一點,你的代碼:

Namespace ans = Namespace.getNamespace("android", "http://schemas.android.com/apk/res/android"); 
    String min = sdk.getAttributeValue("minSdkVersion", ans); 
    String target = sdk.getAttributeValue("targetSdkVersion", ans); 

您聲明命名空間搜索(只有URI搜索時很重要,android命名空間前綴是存在只是爲了方便)

+0

它變得更加清晰,但即使使用命名空間,問題仍然存在 –