0

我正在尝试让 iCal4j 解析导出的 Google .ics 日历文件。不幸的是,解析器在特定值(00001231T000000Z)上阻塞并抛出异常。我的问题是,尽管数据不正确,如何让解析器继续运行?我即将编辑源代码,但没有办法将其配置为不会因日期解析错误而失败。

我正在使用 ical4j-1.0.5-SNAPSHOT - 我相信它基于最新的代码。

我的数据包含以下事件(这似乎是一个反复出现的事件):

BEGIN:VEVENT
DTSTART;TZID=America/Vancouver:20101206T060000
DTEND;TZID=America/Vancouver:20101206T150000
RRULE:FREQ=DAILY;UNTIL=20101210T140000Z
DTSTAMP:20121231T143813Z
UID:[deleted]@google.com
CREATED:00001231T000000Z
DESCRIPTION:
LAST-MODIFIED:20110102T020817Z
LOCATION:
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:iCal4j chokes on this
TRANSP:OPAQUE
END:VEVENT

并在尝试解析此日期值时死掉(这似乎是胡说八道/错误的值)

CREATED:00001231T000000Z

我并不特别关心创建的字段是否已设置或设置为虚拟值。我关心的是解析器继续运行并且不会因错误数据而窒息。

我尝试将解析设置为放松,但不知何故,这种情况似乎漏掉了。

        CompatibilityHints.setHintEnabled(
            CompatibilityHints.KEY_RELAXED_PARSING, true);

那么,我怎样才能让这段代码更健壮地解析错误呢?我可以提供自己的解析器吗?我可以让它跳过有错误的记录吗?

4

3 回答 3

5

这实际上是一种回归。宽松的解析应该已经涵盖了这种情况。只需在分支和提示中修复它(http://ical4j.hg.sourceforge.net/hgweb/ical4j/ical4j/rev/8c23205afac9)。

于 2013-02-02T18:06:12.820 回答
1

我复制了 CalendarBuilder 类,并用 try/catch 包装了属性集方法,如下所示。我仍然有兴趣听到其他解决方案。我真的不喜欢复制整个课程来解决这样的问题。

    public void propertyValue(final String value)
            throws URISyntaxException, ParseException, IOException {

        assertProperty(property);

        try {
            if (property instanceof Escapable) {
                property.setValue(Strings.unescape(value));
            } else {
                property.setValue(value);
            }
        } catch (Exception e) {
            Logger.warn("Could not set propety: " + property.getName()
                    + " to " + value);
        }
    }
于 2013-01-01T00:14:56.423 回答
1

您是否尝试将所有这些设置在一起?

ical4j.unfolding.relaxed=true
ical4j.parsing.relaxed=true
ical4j.validation.relaxed=true
ical4j.compatibility.outlook=true
于 2013-01-02T09:38:57.540 回答