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
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
Vous devez vous connecter pour publier un commentaire.
En regardant ton code, il semble que vous essayez de récupérer le fichier à partir d'un ordinateur sur votre réseau. Avez-vous essayé d'ouvrir l'URL dans un navigateur pour vérifier si il est vraiment envoyer le fichier XML?
Alternativement, vous pouvez également vérifier avec Wireshark, de quoi répondre à votre téléphone récupère. Ma conjecture est que vous simplement ne pas obtenir le document XML en arrière, mais une page d'erreur 404.
Smylie: Quel était le problème?
je ne sais pas encore, je crois, le flux d'entrée, j'étais de passage dans parse() n'était pas totalement de récupérer le document. (Même si quand je me suis converti le flux d'entrée d'une chaîne de caractères et le trempa dans le journal qu'il serait montrer le document complet - peut-être que le flux d'entrée n'était pas de rinçage.... de toute façon, dès que j'ai juste passé parse() l'uri de la place et de le laisser aller chercher le document, le problème a disparu.
Je rencontre exactement le même problème. J'ai ajouté le suivi de l'SAXParseException et à l'aide de SAXParseException.getColumnNumber pour voir si il y avait un caractère fautif. En fait, elle renvoie -1, indiquant que inputstream n'est pas appelé à disparaître correctement. (Ce qui est évidemment cohérent avec le message d'erreur). Je voudrais savoir comment mettre fin à un cours d'eau "correctement" pour l'analyseur sax.
OriginalL'auteur Octavian Damiean
Résolu (en quelque sorte)...
J'ai vu sax.l'analyseur peut aussi prendre une uri directement (au lieu du flux d'entrée).
Dès que je l'ai essayé, il analysée d'accord, et le code est un ensemble beaucoup plus court =)
Merci pour l'aide.
OriginalL'auteur Dave Smylie
Votre problème peut avoir été causé par un problème de codage.
Essayez de créer votre inputStream via un ByteArrayInputStream avec l'encodage UTF-8 comme ci-dessous et voir si cela fonctionne. Cette, (ci-dessous), est ce que j'ai eu à l'utiliser quand j'ai eu une Chaîne XML, mais il peut encore être un problème via le inputestream vous utilisez.
Cela suppose que votre XML est a l'encodage UTF-8 spécifié comme ceci
Sinon, vous devriez assurez-vous que votre encodage défini dans votre InputStream est le même que celui défini dans votre XML.
OriginalL'auteur giulio