Recibo el error "Excepción de SAXParseException: inesperado del documento" al intentar analizar un documento xml en android.SaxParser en Android: Excepción de fin de documento inesperada
El documento en cuestión pertenece a la API de Google, pero parece arrojar el mismo error independientemente del archivo xml en cuestión (siempre que el xml sea válido), así que sospecho que es un problema con mi enfoque, más bien que el xml
Esto se hace como un ejercicio de aprendizaje, por lo que probablemente (esperemos) he pasado por alto algo obvio =)
me he encontrado el código XML a través de un validador en línea, y regresa como está bien formado. (No puede decirme si es válido ya que no tengo una DTD, pero no creo que necesite la DTD para analizar el xml).
Este es el código que estoy usando para tratar de analizar el archivo:
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) {
....
}
Una versión disección del xml que produce el error es:
<?xml version="1.0"?>
<xml_api_reply version="1">
<weather>
<forecast_information>
<city>Hamilton</city>
</forecast_information>
</weather>
</xml_api_reply>
El StackTrace es:
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
En aras de la brevedad, no hemos incluido el XML original, pero es sólo la norma weath er xml de Google feed.
También intenté unos pocos archivos xml completamente diferentes (incluida la muestra de http://www.ibm.com/developerworks/xml/library/x-android/) y todos dan el mismo error. (También todos validan y se forman cuando los ejecuto a través de un validador xml en línea).
Esto me hace pensar que no es un problema con el xml, sino más bien con la forma en que estoy tratando de alimentarlo en el analizador.
Saludos
de Dave Smylie
¿Ha intentado leer primero en el archivo completo? Recuerdo haber tenido un problema así hace mucho tiempo, quizás eso ayude. –
Supongo que sí. Estoy volcando el archivo recuperado a través de android.util.log y muestra el archivo completo allí. Sin embargo, estoy ejecutando ese flujo de entrada en un búfer de cadena, por lo que es posible que el registro esté obteniendo una secuencia completamente terminada, mientras que el parse() obtiene una secuencia incompleta ... Veré si puedo convertirlo a un búfer de cadena y analice que ... –