2013-06-24 3 views
1

JDOM2 라이브러리 (정확히 2.0.5)를 사용하여 Android 애플리케이션에서 XML 파일을 구문 분석하는 데 문제가 있습니다. 자바 프로젝트에서 Android에서 JDOM2로 XML 파일 구문 분석

, 그것은 잘 작동하지만, 안드로이드 응용 프로그램 프로젝트에서, 나는 다음과 같은 메시지가 있어요 :

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()); 
     } 
    } 
} 
: "열 수 없습니다를 http://jeancdc.perso.sfr.fr/fichierXML.xml"여기

내의 XMLReader 클래스

그리고 내 메인 클래스 :

:

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에 대한 Google 결과를 확인하십시오.

더 이상 응용 프로그램의 기본 스레드에서 네트워크에 액세스 할 수 없습니다. 콜백을 사용하여 XML을로드하는 자식 스레드를 만듭니다.

+0

확인하려면 AndroidManifest.xml에서 다음 줄을 변경하여 대상을 버전 9로 변경했습니다. android : targetSdkVersion = "9"그러면 작동합니다. 이제 더 높은 API와의 호환성을 유지하려면 다른 스레드를 구현해야합니다. 감사 ! –

0

String을 전달하는 대신 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

이미이 작업을 시도했지만 아쉽게도이 문제가 해결되지 않습니다. 위의 로그 파일에 가입했습니다. –