2012-05-31 25 views
1

我不常常要求幫忙,我一直在做我的研究,並試圖自己找到解決方案,但這一次我真的被卡住了...... 我對某些語言有很多經驗,但沒有與java ... 所以,我想要做的是一個應用程序,具有動態佈局,並從特定主機上的XML文件加載它。 我的第一個問題是,顯然,從主線程讀取XML是不可能的,所以我不得不學習線程和Asynctaks,並且我決定使用一個簡單的線程並將值存儲在一些全局變量中,I創建,但它不工作... 我也嘗試使用SAX的XML解析器,但我更喜歡DOM。 我只是想這樣做超過3天,我對此有點生氣,我希望有人能幫助我,這裏是我的代碼:任何人都可以幫助我一個android的XML解析器?

這是我定義的類我的變數。它們都應該處理多個值,除了XML之外,它將存儲XML的URL以在線程中使用它。

public class Info { 
     public static String Param1[]; 
     public static String Param2[]; 
     public static String Param3[]; 
     public static String Param4[]; 
     public static String Param5[]; 
     public static String Param6[]; 
     public static String XML; 
} 

這裏是我的主線程:

//Create the basic layout 
ScrollView sv = new ScrollView(this); 
    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    sv.addView(ll); 
Info.XML="mylink"; 
Thread thread = new Thread() 
{ 
    @Override 
    public void run() { 
     try { 
      URL url = new URL(Info.XML); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(new InputSource(url.openStream())); 
      doc.getDocumentElement().normalize(); 
      NodeList ActionContainers = doc.getElementsByTagName("ActionContainer"); 
      Node mainContainer = ActionContainers.item(0); 
      Element Container = (Element) mainContainer; 
      NodeList Actions = Container.getElementsByTagName("Action"); 
      for (int i = 0; i < Actions.getLength(); i++) { 
       Node mainAction = Actions.item(i); 
       Element Action = (Element) mainAction; 
       Info.Param1[i]=Action.getAttribute("Param1"); 
       Info.Param2[i]=Action.getAttribute("Param2"); 
       Info.Param3[i]=Action.getAttribute("Param3"); 
       Info.Param4[i]=Action.getAttribute("Param4"); 
       Info.Param5[i]=Action.getAttribute("Param5"); 
       Info.Param6[i]=Action.getAttribute("Param6"); 
      } 
     } catch (Exception e) { 
      Info.XML="Erro"; 
     } 
    } 
}; 
try{ 
    thread.start(); 
} catch(Exception e){ 
    Info.XML="Erro"; 
} 

    EditText et = new EditText(this); 
     et.setText(Info.XML); 
     ll.addView(et); 
     setContentView(sv); 

沒有檢測到異常,它根本沒有返回XML信息... 我希望有人能在這裏給我一點幫助。

感謝

編輯:

這裏是XML:

<appname Version="yyy" WrittenOn="yyy"> 
<Config> 
    <Page Id="yyy"> 
     <ActionContainer Id="yyy"> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      ... 
     </ActionContainer> 
    </Page> 
</Config> 

我需要所有的XXX,我想有他們如果可能的話multimensional陣列。

+1

爲了完整起見,你可以編輯您的答案,包括你正在試圖解析實際的XML? –

+0

謝謝你的快速回答,我已經用XML編輯了我的文章,我希望你能幫助我:) –

+0

我不確定我是否會成爲回答的人,因爲我已經需要去睡覺:)。但是,你能儘可能多地發佈你的活動嗎?乍看之下,我發現了大約3個可能存在問題的地方,但目前我無法確定哪一個會導致該錯誤。 –

回答

0

我還是覺得有一些代碼丟失,但不會離開你滯留的緣故,這裏的幾件事情,可能是錯的:

  • 你可能沒有真正得到的異常,因爲et.setText(Info.XML);可能之前執行你的線程完成,忽略「ErrNo」。我對這個問題的注意事項:
    • 可能有一個錯誤的URL到您的XML文件(請記住,對於遠程文件,你需要有INTERNET許可,您的應用程序),
    • 您發佈的XML是無效的:<appname>是沒有關閉和/或沒有根元素。
    • 你似乎沒有在任何地方初始化Info.ParamX陣列,這將導致NullPointerException
    • 即使你初始化它們,你不佔Actions.getLength()的大小,這可能會導致ArrayIndexOutOfBoundsException或類似;換句話說,在for循環之前包括Info.ParamX = new String[Actions.getLength()];
    • 除此之外,你的解析代碼似乎工作正常。要正確調試代碼,可以使用中的ADT中的調試選項,使用System.out.println()在catch子句中輸出異常,並在LogCat中檢查它。
  • 此代碼位於何處?如果它不在您的活動的onCreate()中,請將它放在那裏。

此外,一些小問題:

  • 嘗試使用camelBack符號來表示你的Java字段和變量,這會讓你的代碼,Java程序員更易讀。
  • 使用Thread作爲一次性應用程序是可以的,但您應該避免它,例如,將其替換爲AsyncTask(您已閱讀)。

PS。在ParamX,X當然是每個從1到6的整數。

0

而不是Thread你應該嘗試使用AsyncTask。在這裏看到:

穿線官方Android頁是相當不錯的 http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

這說明它非常好太 http://labs.makemachine.net/2010/05/android-asynctask-example/

關於XML解析我的應用程序依賴於大量的XML從HTTP請求中提取,我發現SAX解析器非常好用,一旦你開始使用它就很容易使用。

關於SAX的例子,它是一個長期時間因爲工作出來,但我發現我的書籤這個例子希望它有助於。剛纔看了SAX部分 http://www.ibm.com/developerworks/xml/library/x-android/

希望幫助

相關問題