2016-09-11 14 views
1

オープン天気アプリケーションからデータドキュメントを解析しようとしています。私は正常にファイル全体を読み込んでいます。そのファイル全体をテキスト表示にすることができます。私はそのデータを解析する必要があります。Webサービスからxmlデータを解析しようとしています.SAXParseException

org.xml.sax.SAXParseException::私は解析しようとすると、私はこのエラーを取得します。ここでは、文書

の予期しない終わりを解析し、文書を読み取るための私のコードですが

public void Weather(View view){ 
    InputStream data; 
    final String OPEN_WEATHER_MAP_API = 
      "http://api.openweathermap.org/data/2.5/weather?q="; 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    try { 
     URL url = new URL(String.format(OPEN_WEATHER_MAP_API + City + "&mode=xml&appid=40f9dad632ecd4d87b55cb512d538b75")); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     // connection.addRequestProperty("x-api-key", this.getString(R.string.open_weather_maps_app_id)); 

     data = connection.getInputStream(); 

     InputStreamReader inputStreamReader = new InputStreamReader(data); 
     BufferedReader Reader = new BufferedReader(inputStreamReader); 


     StringBuffer Weatherdata = new StringBuffer(); 
     String storage; 
     while ((storage = Reader.readLine()) != null) { 
      Weatherdata.append(storage + "\n"); 

     } 
     cityField.setText(Weatherdata.toString()); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
     cityField.setText("Fail"); 
     return; 
    } 
    try { 
     DocumentBuilderFactory documetBuilderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder documentBuilder = documetBuilderFactory.newDocumentBuilder(); 
     Document xmlDocument = documentBuilder.parse(data); 
     Element rootElement = xmlDocument.getDocumentElement(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 

} 

私はクイックグーグル検索を実行しましたが、このエラーが発生した相手は、コンピュータ/電話にファイルを保存していたときにこのエラーが発生していました。

答えて

0

これは、XMLを解析しようとしたときにすでにInputStreamの末尾に達しているために発生します。 実際には、InputStreamReaderを使用してストリームコンテンツを表示するときは、ストリームの最後までファイル「カーソル」を移動します。

SAXパーサーで解析しようとすると、この例外が発生します(解析コードをdata.read()の呼び出しに置き換えると-1が返されます)すでにストリームの終わりに到達しています)。

関連するコードInputStreamReaderを削除すると、xmlを解析できます。

あなたは(ファイルの先頭にカーソルをリセットすることができます)reset方法がHttpInputStreamではサポートされていないため、このコードを維持したい場合には、例えばStringBuilderまたはBufferedInputStreamにその内容をコピーする必要があります。

関連する問題