2010-11-21 20 views
10

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

+0

¿Ha intentado leer primero en el archivo completo? Recuerdo haber tenido un problema así hace mucho tiempo, quizás eso ayude. –

+0

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 ... –

Respuesta

3

En cuanto a su código parece que usted está tratando de buscar el fichero de un ordenador de la red. ¿Has intentado abrir esa URL en un navegador para comprobar si realmente está enviando el archivo XML?

Como alternativa, también puede consultar con Wireshark qué respuesta recibe su teléfono. Supongo que simplemente no recuperas el documento XML, sino una página de error 404.

+0

Originalmente pensé que los problemas de red podrían ser el problema, así que ahora lo estoy recuperando de un servidor web local. Veo que la solicitud está completa en el registro del servidor y descargo el contenido del archivo xml recuperado para eclipsar a través de android.util.log, así que estoy bastante seguro de que está recibiendo el archivo correctamente. . . –

+0

@Dave Smylie: ¿Cuál fue el problema? –

+1

todavía no estoy seguro - sospecho que el flujo de entrada que estaba pasando en parse() no estaba recuperando completamente el documento. (Aunque cuando convertí el flujo de entrada a una cadena y lo arrojé al registro, mostraba el documento completo, por lo que posiblemente la corriente de entrada no se sonrojara ... de todos modos, tan pronto como acabo de pasar el parseo(), un uri y dejar que busque el documento, el problema desapareció. –

4

Resuelto (tipo de) ...

vi sax.parser también podría tomar en un URI directamente (en lugar del flujo de entrada).

Tan pronto como he tratado de eso, es analizado sintácticamente bien, y el código era mucho más cortos =)

Gracias por la ayuda.

String weatherFeed = "http://192.168.1.66:8000/google.xml"; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document dom = db.parse(weatherFeed); 
3

Su problema puede haber sido causado por un problema de codificación.

Intente crear su inputStream a través de ByteArrayInputStream con codificación UTF-8 como se muestra a continuación y vea si eso funciona. Esto, (abajo), es lo que tuve que usar cuando tenía un String of XML, pero aún así puede ser un problema a través del inputestream que está usando.

String sData = "..Your XML in here.."; 
DocumentBuilder db = dbf.newDocumentBuilder(); 
InputStream is = new ByteArrayInputStream(sData.getBytes("UTF-8")); 
Document doc = db.parse(is); 

Esto supone que el XML es tiene codificación UTF-8 especificado como esto

<?xml version="1.0" encoding="UTF-8" ?> 

lo contrario, debe asegurarse de que su codificación definido en su InputStream es el mismo que el definido en el código XML.

Cuestiones relacionadas