2010-11-21 54 views
10

當試圖解析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

+0

您是否試過先閱讀完整文件?我記得很久以前有過這樣的問題,也許有幫助。 – 2010-11-21 18:07:52

+0

我假設是這樣的 - 我通過android.util.log拋出檢索到的文件,它顯示了那裏的完整文件。然而,我運行該輸入流到一個字符串緩衝區,所以有可能是日誌得到一個完整的流,其中作爲parse()獲取不完整的流....我會看看我是否可以將其轉換爲字符串緩衝區和解析... – 2010-11-22 05:22:26

回答

3

看你的代碼,看來你正試圖在網絡上獲取文件後,電腦。您是否嘗試在瀏覽器中打開該URL以檢查它是否真的在發送XML文件?

或者,您也可以使用Wireshark檢查您的手機所獲得的答案。我的猜測是,你只是不會獲得XML文檔,而是一個404錯誤頁面。

+0

我原本以爲網絡問題可能是問題,所以我現在正在檢索它的本地網絡服務器。我可以在服務器日誌中看到完整的請求,並通過android.util.log將所檢索到的xml文件的內容轉儲到eclipse,所以我非常確定它正在接收文件。 。 。 – 2010-11-22 05:20:12

+0

@Dave Smylie:問題是什麼? – 2010-11-22 19:25:19

+1

我仍然不確定 - 我懷疑我傳入parse()的輸入流沒有完全檢索文檔。 (即使當我將輸入流轉換爲字符串並將其轉儲到日誌中時,它會顯示完整的文檔 - 因此可能輸入流不會沖洗....無論如何,只要我通過parse()一個uri並讓它獲取文檔問題消失 – 2010-11-23 07:13:04

4

解決(在某種程度上)...

我看到sax.parser也可以採取在URI直接(而不是輸入流)。

只要我試過了,它解析好,代碼是一大堆較短=)

感謝您的幫助。

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

您的問題可能是由編碼問題引起的。

嘗試使用UTF-8編碼(如下所示)通過ByteArrayInputStream創建inputStream,看看是否有效。這(下面)是我使用XML字符串時必須使用的,但它可能仍然是您正在使用的inputestream的問題。

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

這是假設你的XML是有這樣的

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

規定,否則你應該確保在你的InputStream定義您的編碼是一樣的,在你的XML定義的UTF-8編碼。