Parsing ical Format - Ausnahme analysieren
Frage
Ich benutze ICIC4J, um das iCale Format auf dem Android zu analysieren.
Meine Eingabe -ICs lautet:
BEGIN:VCALENDAR
BEGIN:VEVENT
SEQUENCE:5
DTSTART;TZID=US/Pacific:20021028T140000
DTSTAMP:20021028T011706Z
SUMMARY:Coffee with Jason
UID:EC9439B1-FF65-11D6-9973-003065F99D04
DTEND;TZID=US/Pacific:20021028T150000
END:VEVENT
END:VCALENDAR
Aber wenn ich versuche, dies zu analysieren, bekomme ich die Ausnahme:
Error at line 1: Expected [VCALENDAR], read [VCALENDARBEGIN]
Der entsprechende Code ist:
HttpHelper httpHelper = new HttpHelper(
"http://10.0.2.2/getcalendar.php", params);
StringBuilder response = httpHelper.postData();
StringReader sin = new StringReader(response.toString());
CalendarBuilder builder = new CalendarBuilder();
Calendar cal = null;
try {
cal = builder.build(sin);
} catch (IOException e) {
Log.d("calendar", "io exception" + e.getLocalizedMessage());
} catch (ParserException e) {
Log.d("calendar", "parser exception" + e.getLocalizedMessage());
}
public class HttpHelper {
final HttpClient client;
final HttpPost post;
final List<NameValuePair> data;
public HttpHelper(String address, List<NameValuePair> data) {
client = new DefaultHttpClient();
post = new HttpPost(address);
this.data = data;
}
private class GetResponseTask extends AsyncTask<Void, Void, StringBuilder> {
protected StringBuilder doInBackground(Void... arg0) {
try {
HttpResponse response = client.execute(post);
return inputStreamToString(response.getEntity().getContent());
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
}
public StringBuilder postData() {
try {
post.setEntity(new UrlEncodedFormEntity(data));
return (new GetResponseTask().execute()).get();
} catch (UnsupportedEncodingException e) {
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return null;
}
private StringBuilder inputStreamToString(InputStream is)
throws IOException {
String line = "";
StringBuilder total = new StringBuilder();
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
while ((line = rd.readLine()) != null) {
total.append(line);
Log.v("debug", "Line: " + line);
}
// Return full string
return total;
}
}
Lösung
Meine Vermutung wären die Linienende in der Antwortzeichenfolge von dem, was ICIC4J erwartet.
Der Standard gibt an, dass Sie CRLF (auch bekannt als ' r n') verwenden sollten.
Andere Tipps
Die Eingabedatei ist gültig, das Problem ist mit Ihrer Methode InputStreamToString (), die eine Readline () für die Eingabe (die die Neulinge befreit) ausführt und an eine Zeichenfolge angehängt wird, ohne die Neulinge neu zu beraten.
Ich würde vorschlagen, entweder eine Alternative zu Readline () zu verwenden (wenn Sie Neulinien aus der Originaldatei erhalten möchten) oder Ihre eigenen Neulisten in der Schleife anhängen, z. B.:
while ((line = rd.readLine()) != null) {
total.append(line);
total.append("\r\n");
Log.v("debug", "Line: " + line);
}