Pregunta

Me estoy poniendo un "SAXParseException: Final inesperado del documento" error al intentar analizar un documento XML en android.

El documento en cuestión es de la API de Google tiempo, pero parece que tirar el mismo error sin importar el archivo XML en cuestión (siempre que el XML es válido), así que sospecho que es un problema con mi enfoque, en lugar de el XML.

Esto se hace como un ejercicio de aprendizaje, por lo que probablemente ha (con suerte) daba algo obvias =)

Me he encontrado el código XML a través de un validador en línea, y regresa como está bien formado. (No me puede decir si es válida, ya que no tengo una DTD, pero yo no creo que tenga la DTD para analizar el código 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 cutdown 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 he incluido el código XML original, pero es sólo el xml tiempo estándar de alimentación gafas.

También he intentado un par de archivos XML completamente diferentes, (incluyendo la muestra de http://www.ibm.com/developerworks/xml/library/x-android/ ) y todos ellos dan el mismo error. (También toda validar así formadas cuando ellos se ejecutan a través de un validador de 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 alimentar en el analizador.

Saludos

David Smylie

¿Fue útil?

Solución

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

Como alternativa también se puede comprobar con Wireshark lo que contesta el teléfono recibe. Mi conjetura es que simplemente no recibe la parte de atrás documento XML, sino una página de error 404.

Otros consejos

Resuelto (tipo de) ...

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

Tan pronto como he intentado, que analiza bien, y el código era mucho más corto =)

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

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

Trate de crear su flujoEntrada a través de un ByteArrayInputStream con codificación UTF-8, como a continuación y ver si funciona. Esto, (abajo), es lo que tenía que utilizar cuando tenía una cadena de XML, pero todavía puede ser un problema a través de la inputestream que está utilizando.

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 ha codificación UTF-8 especificado como esto

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top