문제

I've got a problem to parse a XML file in an Android application with the library JDOM2 (2.0.5 to be exact).

In a Java project, it works fine but in an Android application project, I've got the following message : "Couldn't open http://jeancdc.perso.sfr.fr/fichierXML.xml"

Here is my XMLReader class :

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());
        }   
    }
}

And my main class :

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();
    }
}

This is part of the exception trace I get in my logs:

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
도움이 되었습니까?

해결책

last comment helps a lot. Check out the google results for NetworkOnMainThreadException

You are no longer allowed to access the network from the main thread in the application. Create a child thread with a callback to load the XML

다른 팁

Try it with passing an URL instead of passing a String.

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top