SaxParser sur Android: Fin Inattendue Du Document d'Exception

Que je suis un "SAXParseException: fin Inattendue du document" erreur lors de la tentative d'analyser un document xml sur android.

Le document en question est à partir de google météo api, mais il semble jeter le même message d'erreur quel que soit le fichier xml en question (tant que le document xml est valide), donc je suppose que c'est un problème avec mon approche, plutôt que le xml.

Ce qui est fait comme un exercice d'apprentissage, donc j'ai sans doute (j'espère) oublié quelque chose d'évident =)

J'ai exécuter le xml en ligne validateur, et il revient à être bien formé. (Ne peut pas me dire si c'est valable tant que je n'ai pas de DTD, mais je ne pense pas que j'ai besoin de la DTD pour parser le xml).

C'est le code que j'utilise pour essayer d'analyser ce fichier:

private void refreshForecast() 
        URL url;
        try {       
                url = new URL( "http://192.168.1.66:8000/google4.xml");

                URLConnection connection = url.openConnection();
                HttpURLConnection httpConnection = (HttpURLConnection)connection; 
                int responseCode = httpConnection.getResponseCode(); 

                if (responseCode == HttpURLConnection.HTTP_OK) { 
                        InputStream in = httpConnection.getInputStream();        
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();

                        //falls over here parsing the xml.
                        Document dom = db.parse(in);    
                }
        } catch (ManyExceptions e) {
        .... 
} 

Un cutdown de la version de xml qui produit l'erreur est:

<?xml version="1.0"?>
<xml_api_reply version="1">
      <weather>
            <forecast_information>
                    <city>Hamilton</city>
            </forecast_information>
      </weather>
</xml_api_reply>

La stacktrace:

11-20 06:17:24.416: WARN/System.err(406): org.xml.sax.SAXParseException: Unexpected end of document
11-20 06:17:24.416: WARN/System.err(406):     at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:131)
11-20 06:17:24.416: WARN/System.err(406):     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:110)
11-20 06:17:24.426: WARN/System.err(406):     at com.dave.nzweather.WeatherApp.refreshForecast(WeatherApp.java:159)
11-20 06:17:24.426: WARN/System.err(406):     at com.dave.nzweather.WeatherApp.onCreate(WeatherApp.java:100)
11-20 06:17:24.426: WARN/System.err(406):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-20 06:17:24.438: WARN/System.err(406):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-20 06:17:24.438: WARN/System.err(406):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-20 06:17:24.446: WARN/System.err(406):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-20 06:17:24.446: WARN/System.err(406):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-20 06:17:24.456: WARN/System.err(406):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-20 06:17:24.456: WARN/System.err(406):     at android.os.Looper.loop(Looper.java:123)
11-20 06:17:24.456: WARN/System.err(406):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-20 06:17:24.466: WARN/System.err(406):     at java.lang.reflect.Method.invokeNative(Native Method)
11-20 06:17:24.466: WARN/System.err(406):     at java.lang.reflect.Method.invoke(Method.java:521)
11-20 06:17:24.466: WARN/System.err(406):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-20 06:17:24.476: WARN/System.err(406):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-20 06:17:24.476: WARN/System.err(406):     at dalvik.system.NativeStart.main(Native Method)
11-20 06:17:24.486: WARN/ROGER(406): org.xml.sax.SAXParseException: Unexpected end of document

Par souci de concision, je n'ai pas inclus le xml d'origine, mais c'est juste la norme météo xml à partir de google flux.

J'ai aussi essayé un peu complètement différent, les fichiers xml (y compris l'échantillon de http://www.ibm.com/developerworks/xml/library/x-android/) et ils donnent tous la même erreur. (Ils ont aussi tous de valider ainsi formé lorsque je par en ligne validateur xml).

Cela me fait penser que ce n'est pas un problème avec le xml, mais plutôt avec la façon dont je suis en train de l'introduire dans l'analyseur.

Acclamations

Dave Smylie

Avez-vous essayé de lecture dans le fichier complet en premier? Je me souviens avoir eu un problème comme ça il y a longtemps, peut-être cela peut vous aider.
Je suppose donc - je suis dumping le fichier récupéré via android.util.journal et c'est en montrant le dossier complet. Cependant, la messagerie instantanée en cours d'exécution qui inputstream dans un stringbuffer, il est donc possible que le journal est d'obtenir un complètement terminé ruisseau, où que parse() est d'obtenir une incomplètes flux.... Je vais voir si je peux le convertir en un stringbuffer et analyser...

OriginalL'auteur Dave Smylie | 2010-11-21