2013-06-24 43 views
1

我遇到了一個問題,需要使用庫JDOM2(確切地說是2.0.5)解析Android應用程序中的XML文件。使用JDOM2解析XML文件Android

在一個Java項目,它工作正常,但在Android應用程序的項目,我有以下消息:「無法打開http://jeancdc.perso.sfr.fr/fichierXML.xml

這裏是我的XMLReader類:

package fr.jcdc.exemple.jdom; 

import java.io.IOException; 
import java.util.List; 

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.JDOMException; 
import org.jdom2.input.SAXBuilder; 

import android.util.Log; 

public class XMLReader { 

    public XMLReader() { 
     super(); 
    } 

    public void loading() { 

     try { 

      SAXBuilder builder = new SAXBuilder(); 

      Document document = (Document) builder.build("http://jeancdc.perso.sfr.fr/fichierXML.xml"); 

      Element rootNode = document.getRootElement(); 
      List<Element> charactersList = rootNode.getChildren("personnage"); 

      for (int i = 0; i < charactersList.size(); i++) { 

       Element node = (Element) charactersList.get(i); 

       Log.d("tag", node.getChildText("prenom") + " " + node.getChildText("nom"));  
      } 

     } 
     catch (IOException ioex) { 
      Log.d("ioex", ioex.getMessage()); 
     } 
     catch (JDOMException jdomex) { 
      Log.d("jdomex", jdomex.getMessage()); 
     } 
    } 
} 

我的主類:

package fr.jcdc.exemple.jdom; 

import android.os.Bundle; 
import android.app.Activity; 

public class MainActivity extends Activity { 

    private XMLReader xmlReader = new XMLReader(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     xmlReader.loading(); 
    } 
} 

這是異常跟蹤,我在日誌中獲取的一部分:

06-24 22:58:39.794: D/ioex(18560): Couldn't open http://jeancdc.perso.sfr.fr/fichierXML.xml 
06-24 22:58:39.794: W/System.err(18560): java.io.IOException: Couldn't open http://jeancdc.perso.sfr.fr/fichierXML.xml 
06-24 22:58:39.864: W/System.err(18560): at org.apache.harmony.xml.ExpatParser.openUrl(ExpatParser.java:755) 
06-24 22:58:39.864: W/System.err(18560): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:292) 
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217) 
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:277) 
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1141) 
..... 
06-24 22:58:39.864: W/System.err(18560): Caused by: android.os.NetworkOnMainThreadException 
06-24 22:58:39.872: W/System.err(18560): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
06-24 22:58:39.872: W/System.err(18560): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
06-24 22:58:39.872: W/System.err(18560): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
06-24 22:58:39.880: W/System.err(18560): ... 20 more 
+0

您的應用程序是否具有網絡權限? – rolfl

+0

我在AndroidManifest.xml中添加了這一行:我需要添加其他權限嗎? –

+0

給出關於錯誤信息的更多細節如何。有沒有原因? – rolfl

回答

1

最後的評論幫助很大。查看NetworkOnMainThreadException的谷歌搜索結果

您不再允許您從應用程序的主線程訪問網絡。創建一個帶回調的子線程來加載XML

+0

好的,爲了驗證,我通過更改AndroidManifest.xml中的以下行將目標更改爲版本9:android:targetSdkVersion =「9」,它可以工作。所以現在,我必須實現其他線程才能與更高的API兼容。謝謝 ! –

0

嘗試傳遞URL而不是傳遞字符串。

java.net.URL temp; 
try { 
    temp = new java.net.URL("http://jeancdc.perso.sfr.fr/fichierXML.xml"); 
} catch (java.net.MalformedURLException e) { 
    temp = null; 
} 
Document document = (Document) builder.build(temp); 
+0

已經嘗試過,不幸的是,它不能解決問題。我上面加入了一個日誌文件。 –