如何从网站获取我的数据,以便我可以解析它?
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)
您可以使用此:
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);
如果我使用它,它不会自动读取每一行,对吗?我如何阅读每一行?谢谢btw – user3117628
如果它在JSON中,它在一行中,所以parseThis将保存整个JSONObject。如果它实际上是多个,您可以再次调用'reader.readLine()',它将跳转到下一个。你非常欢迎。祝你好运。 – Steeno
标题是完全错误的!您已经设法从网页获取数据。所有你想知道的是如何从输入流中读取单个字符串! – isnot2bad
@不是,请参阅编辑。抱歉。 – user3117628