當試圖解析android上的xml文檔時,出現「SAXParseException:意外的文檔結束」錯誤。Android上的SaxParser:意外的文檔結束異常
有問題的文檔來自谷歌的天氣api,但它似乎拋出相同的錯誤,無論有問題的xml文件(只要xml是有效的),所以我懷疑這是我的方法的問題,而是比xml。
這是正在做一個學習鍛鍊,所以我可能(希望如此)忽略了一些明顯=)
我通過網上驗證運行XML,並且它回來爲被完全形成了。 (不能告訴我它是否有效,因爲我沒有DTD,但我不認爲我需要DTD來解析xml)。
這是我用來嘗試解析文件中的代碼:
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) {
....
}
產生錯誤的XML的縮減版本,:
<?xml version="1.0"?>
<xml_api_reply version="1">
<weather>
<forecast_information>
<city>Hamilton</city>
</forecast_information>
</weather>
</xml_api_reply>
堆棧跟蹤是:
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
爲了簡潔起見,我沒有包含原始的xml,但它只是標準的weath呃從谷歌飼料xml。
我也嘗試了幾個完全不同的xml文件(包括http://www.ibm.com/developerworks/xml/library/x-android/的示例),它們都給出了相同的錯誤。 (當我通過一個在線xml驗證器運行它們時,它們也都會被驗證)。
這讓我覺得這不是xml的問題,而是與我如何將它饋送到解析器中。
乾杯
戴夫Smylie
您是否試過先閱讀完整文件?我記得很久以前有過這樣的問題,也許有幫助。 – 2010-11-21 18:07:52
我假設是這樣的 - 我通過android.util.log拋出檢索到的文件,它顯示了那裏的完整文件。然而,我運行該輸入流到一個字符串緩衝區,所以有可能是日誌得到一個完整的流,其中作爲parse()獲取不完整的流....我會看看我是否可以將其轉換爲字符串緩衝區和解析... – 2010-11-22 05:22:26