2010-11-21 39 views
10

アンドロイドでxmlドキュメントを解析しようとすると、「SAXParseException:Unexpected end of document」エラーが表示されます。AndroidのSaxParser:予期しないドキュメント終了の末尾

問題のドキュメントはgoogle weather APIのものですが、問題のXMLファイルに関係なく同じエラーがスローされるようです(XMLが有効な限り)。 XMLよりも。

これは、学習運動として行われているので、私は多分(たぶん)明白な何か=)私はオンラインバリデータを通じてXMLを実行した

を見落としてきたし、それがうまく形成されているものとして戻ってきます。 (私はDTDを持っていないので、それが有効かどうか教えてもらえませんが、xmlを解析するためにDTDが必要なのではないかと思います)。

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 goo goo goo教えて!

私はまた、いくつかの完全に異なるxmlファイル(http://www.ibm.com/developerworks/xml/library/x-android/のサンプルを含む)を試しましたが、それらはすべて同じエラーを出します。 (それらはまた、私がオンラインのxmlバリデーターを通してそれらを実行するときに形成されたものでもあります)。

これは、XMLには問題がないと思いますが、パーサにどのようにフィードしているのかと思います。

乾杯あなたのコードを見てみると

デイブSmylie

+0

最初に完全なファイルを読み込もうとしましたか?私は長いこと前にそのような問題を抱えていたことを覚えています。 –

+0

私はそう仮定しています - 検索したファイルをandroid.util.logでダンプして、そこに完全なファイルを表示しています。しかし、インプットストリームをstringbufferで実行しているので、ログが完全に終了したストリームを取得している可能性があります。parse()は不完全なストリームを取得しています。これをstringbufferに変換できるかどうかを確認します。それを解析してください... –

答えて

3

あなたのネットワーク上のコンピュータオフファイルを取得しようとしているようです。そのURLをブラウザで開き、実際にXMLファイルを送信しているかどうかを確認しようとしましたか?

また、Wiresharkに電話の応答を確認することもできます。私の推測では、単にXML文書を元に戻すのではなく、404エラーページを取得するだけです。

解決
+0

私はもともとネットワークの問題が問題かもしれないと思っていましたので、私は現在ローカルWebサーバーのそれを取得しています。私は要求がサーバログで完全に完了しているのを見ることができ、検索されたxmlファイルの内容をandroid.util.logでeclipseにダンプして、ファイルを受け取っていると確信しています。 。 。 –

+0

@Dave Smylie:何が問題だったのですか? –

+1

私はまだよく分かりません - 私が入力ストリームを渡していたのは、parse()がドキュメントを完全に取得していないと思われます。 (たとえ入力ストリームを文字列に変換してログにダンプしても、完全なドキュメントが表示されていたとしても、入力ストリームはフラッシングしませんでした...とにかく、代わりにURIをparse()に渡すとすぐに –

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

問題は、エンコードの問題が原因で発生している可能性があります。

ByteArrayInputStreamを使用してinputStreamをUTF-8エンコーディングで作成してみましょう。これは(以下)、XMLのStringを持っているときに使用しなければならなかったものですが、使用している入力ストリームを介して引き続き問題になる可能性があります。

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

これはあなたのXMLであることを前提としていそうでなければ、あなたのInputStreamで定義されたエンコーディングがあなたのXMLで定義されたものと同じであることを確認する必要があり、この

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

のように指定したUTF-8エンコーディングを持っています。

関連する問題