解析格式 - 解析异常

发布于 2024-12-02 18:40:33 字数 2550 浏览 7 评论 0原文

我正在使用 ical4j 解析 Android 上的 ical 格式。

我的输入 ics 是:

    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

但是当我尝试解析它时,出现异常:

第 1 行错误:预期 [VCALENDAR],读取 [VCALENDARBEGIN]

相关代码是:

    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;
}
}

I am using ical4j to parse the ical format on the Android.

My input ics is:

    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

But when I try to parse this I get the exception:

Error at line 1: Expected [VCALENDAR], read [VCALENDARBEGIN]

The relevant code is:

    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;
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不寐倦长更 2024-12-09 18:40:33

我的猜测是响应字符串中的行结尾与 ical4j 期望的不同。

标准指定您应该使用 CRLF(又名“\r\n”)。

My guess would be the line endings in the response string are different from what ical4j expects.

The standard specifies you should use CRLF (aka '\r\n').

娇纵 2024-12-09 18:40:33

输入文件有效,问题出在您的方法 inputStreamToString() 上,该方法对输入执行 readLine() (去除换行符)并附加到字符串而不重新添加换行符。

我建议使用 readLine() 的替代方法(如果您想保留原始文件中的换行符),或者在循环中附加您自己的换行符,例如:

while ((line = rd.readLine()) != null) {
    total.append(line);
    total.append("\r\n");
    Log.v("debug", "Line: " + line);
}

The input file is valid, the problem is with your method inputStreamToString(), which performs a readLine() on the input (which strips the newlines) and appends to a string without re-adding the newlines.

I would suggest either to use an alternative to readLine() (if you want to preserve newlines from the original file), or append your own newlines in the loop, eg:

while ((line = rd.readLine()) != null) {
    total.append(line);
    total.append("\r\n");
    Log.v("debug", "Line: " + line);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文