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