如何使ICAL4J不会在解析错误(例如00001231T000000Z)上失败



我正在尝试使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);

那么,如何使该代码更强大地解析错误?我可以提供自己的解析器吗?我可以让它跳过有错误的记录吗?

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

我复制了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);
        }
    }

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

ical4j.unfolding.relaxed=true
ical4j.parsing.relaxed=true
ical4j.validation.relaxed=true
ical4j.compatibility.outlook=true

相关内容

  • 没有找到相关文章

最新更新