Domanda

sto diventando un "SAXParseException: fine imprevista del documento" l'errore quando si tenta di analizzare un documento XML su android.

Il documento in questione è da Google Weather API, ma sembra gettare lo stesso errore indipendentemente dal file XML in questione (fino a quando il XML è valido), così ho il sospetto che sia un problema con il mio approccio, piuttosto che xml.

Questo è stato fatto come un esercizio di apprendimento, in modo probabilmente ho (si spera) si affacciava qualcosa di ovvio =)

Ho eseguito l'XML tramite un validatore on-line, e si torna ad essere ben formato. (Non mi può dire se è valido come io non ho un DTD, ma io non credo di aver bisogno del DTD per analizzare il codice XML).

Questo è il codice che sto usando per cercare di analizzare il file:

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 versione cutdown del xml che produce l'errore è:

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

Lo 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

Per motivi di brevità, non ho incluso l'XML originale, ma è solo il tempo standard XML dai mangimi Googles.

Inoltre ho provato un paio di file XML completamente diversi, (tra cui il campione da http://www.ibm.com/developerworks/xml/library/x-android/ ) e tutti danno lo stesso errore. (Hanno anche tutto validate e formano quando li ho eseguito attraverso un validatore XML on-line).

Questo mi fa pensare che non è un problema con il xml, ma piuttosto di come sto cercando di inserirlo nella parser.

Saluti

Dave Smylie

È stato utile?

Soluzione

Guardando il codice sembra che si sta cercando di recuperare il file da un computer in rete. Hai provato ad aprire l'URL in un browser per verificare se è davvero l'invio del file XML?

In alternativa si può anche verificare con Wireshark cosa rispondere al telefono ottiene. La mia ipotesi è che semplicemente non si ottiene la parte posteriore documento XML, ma una pagina di errore 404.

Altri suggerimenti

Risolto (o quasi) ...

Ho visto sax.parser potrebbe anche prendere in un URI direttamente (anziché il flusso di input).

Non appena ho provato, è analizzato va bene, e il codice è stato un bel po 'più corta =)

Grazie per l'aiuto.

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

Il problema potrebbe essere stato causato da un problema di codifica.

Prova a creare il tuo inputStream tramite un ByteArrayInputStream con codifica UTF-8 come qui sotto e vedere se funziona. Questo, (qui di seguito), è quello che ho dovuto usare quando ho avuto una serie di XML, ma può ancora essere un problema tramite l'inputestream che si sta utilizzando.

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

Questo presuppone che il XML è ha codifica specificata UTF-8 come questo

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

In caso contrario, è necessario assicurarsi che la codifica definito nel InputStream è lo stesso di quello definito nel XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top