Analización de formato ical - excepción de análisis
Pregunta
Estoy usando ical4J para analizar el formato ical en el android.
Mi ICS de entrada es:
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
Pero cuando trato de analizar esto, obtengo la excepción:
Error at line 1: Expected [VCALENDAR], read [VCALENDARBEGIN]
El código relevante es:
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;
}
}
Solución
Supongo que las terminaciones de línea en la cadena de respuesta son diferentes de lo que ical4j espera.
El estándar especifica que debe usar CRLF (también conocido como ' r n').
Otros consejos
El archivo de entrada es válido, el problema es con su método inputStreamToString (), que realiza una línea de lectura () en la entrada (que elimina las nuevas líneas) y agrega una cadena sin volver a admitir las líneas nuevas.
Sugeriría usar una alternativa a Readline () (si desea preservar nuevas líneas del archivo original) o agregar sus propias líneas nuevas en el bucle, por ejemplo:
while ((line = rd.readLine()) != null) {
total.append(line);
total.append("\r\n");
Log.v("debug", "Line: " + line);
}