如何从网站获取我的数据,以便我可以解析它?

问题描述:

public class ODKortrijkWebservice extends AsyncTask < ODKortrijkInterface, Void, String > { 
     private ODKortrijkInterface listener;@ 
     Override 
     protected String doInBackground(ODKortrijkInterface...arg0) { 
      listener = arg0[0]; 
      InputStream is = null; 
      int len = 10000; 
      StringBuilder winkelBuilder = new StringBuilder(); 

      // execute search 
      try { 

       URL url = new URL("http://data.kortrijk.be/middenstand/winkels_markten"); 
       try { 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setReadTimeout(10000 /* milliseconds */); 
        urlConnection.setConnectTimeout(15000 /* milliseconds */); 
        urlConnection.setRequestMethod("GET"); 
        urlConnection.setDoInput(true); 
        urlConnection.connect(); 
        int response = urlConnection.getResponseCode(); 
        Log.d("Inputstream", "The response is: " + response); 
        is = urlConnection.getInputStream(); 
        // Todo: add every line to my winkelBuilder?? 
       } finally { 
        if (is != null) { 
         is.close(); 
        } 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return winkelBuilder.toString(); 
     } 


     protected void onPostExecute(String result) { 
      ArrayList <Winkel> winkels = processResult(result); 
      listener.updateScreen(winkels); 
     } 

     private ArrayList <Winkel> processResult(String result) { 
      ArrayList <Winkel> winkels = new ArrayList <Winkel>(); 
      Winkel winkel = new Winkel(); 
      try { 
       // parse XML 
       XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
       factory.setNamespaceAware(true); 
       XmlPullParser xpp = factory.newPullParser(); 
       xpp.setInput(new StringReader(result)); 

       int eventType = xpp.getEventType(); 
       boolean isItem = false; 
       while (eventType != XmlPullParser.END_DOCUMENT) { 
        if (eventType == XmlPullParser.START_TAG) { 
         if (xpp.getName().equalsIgnoreCase("company")) { 
          winkel = new Winkel(); 
          isItem = true; 
         } else if (xpp.getName().equalsIgnoreCase("bedrijfsnaam") && isItem) { 
          xpp.next(); 
          winkel.setNaam(xpp.getText()); 
         } else if (xpp.getName().equalsIgnoreCase("postcde") && isItem) { 
          xpp.next(); 
          winkel.setPostcode(xpp.getText()); 
         } else if (xpp.getName().equalsIgnoreCase("deelgemeente") && isItem) { 
          xpp.next(); 
          winkel.setGemeente(xpp.getText()); 
         } else if (xpp.getName().equalsIgnoreCase("gemeente") && isItem) { 
          xpp.next(); 
          winkel.setDeelGemeente(xpp.getText()); 
         } else if (xpp.getName().equalsIgnoreCase("adres") && isItem) { 
          winkel.setAdres(xpp.getText()); 
          winkels.add(winkel); 
          isItem = false; 
         } 

        } 
        eventType = xpp.next(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return winkels; 
     } 
    } 

我有我的解析器在底部,我需要从webservice获取数据并读取每一行,放入我的stringbuilder,以便它可以被解析器读取和解析。我认为(???)我正确连接到数据库,但是如何使数据可读?谢谢如何从网站获取我的数据,以便我可以解析它?

编辑:当试图运行它,我得到这个错误:

07-27 13:31:57.993 17259-17288/com.example.hoofdgebruiker.winkelskortrijk E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                          Process: com.example.hoofdgebruiker.winkelskortrijk, PID: 17259 
                          java.lang.RuntimeException: An error occured while executing doInBackground() 
                           at android.os.AsyncTask$3.done(AsyncTask.java:304) 
                           at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                           at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                           at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                           at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                           at java.lang.Thread.run(Thread.java:818) 
                          Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
                           at com.example.hoofdgebruiker.winkelskortrijk.Utill.ODKortrijkWebservice.doInBackground(ODKortrijkWebservice.java:28) 
                           at com.example.hoofdgebruiker.winkelskortrijk.Utill.ODKortrijkWebservice.doInBackground(ODKortrijkWebservice.java:24) 
                           at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                           at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                           at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                           at java.lang.Thread.run(Thread.java:818)  
+0

标题是完全错误的!您已经设法从网页获取数据。所有你想知道的是如何从输入流中读取单个字符串! – isnot2bad

+0

@不是,请参阅编辑。抱歉。 – user3117628

您可以使用此:

BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); String parseThis = reader.readLine();

这会给你输出的字符串。如果是JSON,请添加:

JSONObject jsonObj = new JSONObject(parseThis); JSONArray arrayOfStuff = jsonObj.getJSONArray(array_tag);

+0

如果我使用它,它不会自动读取每一行,对吗?我如何阅读每一行?谢谢btw – user3117628

+0

如果它在JSON中,它在一行中,所以parseThis将保存整个JSONObject。如果它实际上是多个,您可以再次调用'reader.readLine()',它将跳转到下一个。你非常欢迎。祝你好运。 – Steeno