0

エクスポートされた Google .ics カレンダー ファイルを iCal4j で解析しようとしています。残念ながら、パーサーは特定の値 (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 クラスをコピーし、以下のようにプロパティ set メソッドを 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 に答える