2

Objective-C を使用して VCALENDAR データを解析する簡単な方法を探しています。特に私が関心を持っているのは、FREEBUSY データだけです (以下を参照)。

BEGIN:VCALENDAR
VERSION:2.0
METHOD:REPLY
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VFREEBUSY
UID:XYZ-DONT-CARE
DTSTART:20090605T070000Z
DTEND:20090606T070000Z
ATTENDEE:/principals/__uids__/ABC1234-53D8-4079-8392-01274F97F5E1/
DTSTAMP:20090605T075430Z
FREEBUSY;FBTYPE=BUSY:20090605T170000Z/20090605T200000Z,20090605T223000Z/20
 090606T003000Z
FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20090605T070000Z/20090605T150000Z,2009060
 6T010000Z/20090606T070000Z
ORGANIZER:/principals/__uids__/ABC1234-53D8-4079-8392-01274F97F5E1/
END:VFREEBUSY
END:VCALENDAR

componentsSeparatedByString:@"\n" を使用して解析しようとしましたが、FREEBUSY データの一部に \n が含まれているため、正しく解析されません。

私が見逃している簡単なものはありますか?

4

2 に答える 2

8

\nFREEBUSY データの中間は iCalendar 仕様の一部です。RFC 2445によると、スペースが続く改行は、長い行を分割する正しい方法であるため、FREEBUSY データをスキャンすると、おそらくこれが多く見られるでしょう。

ネイサンが示唆するようにNSScanner、期待するデータが合理的に一貫している場合、必要なのは だけかもしれません。ただし、iCalendar には多くの気まぐれな部分があるため、私はlibicalを使用して ics 情報を解析することがよくあります。libical を使用してこのデータを解析する簡単な例:

NSString *caldata = @"BEGIN:VCALENDAR\nVERS....etc";

icalcomponent *root = icalparser_parse_string([caldata cStringUsingEncoding:NSUTF8StringEncoding]);

if (root) {

    icalcomponent *c = icalcomponent_get_first_component(root, ICAL_VFREEBUSY_COMPONENT);

    while (c) {
        icalproperty *p = icalcomponent_get_first_property(c, ICAL_FREEBUSY_PROPERTY);

        while (p) {
            icalvalue *v = icalproperty_get_value(p);
            // This gives: 20090605T170000Z/20090605T200000Z
            // (note that stringWithCString is deprecated)
            NSLog(@"FREEBUSY Value: %@", [NSString stringWithCString:icalvalue_as_ical_string(v)]);
            icalparameter *m = icalproperty_get_first_parameter(p, ICAL_FBTYPE_PARAMETER);

            while (m) {
                // This gives: FBTYPE=BUSY
                NSLog(@"Parameter: %@", [NSString stringWithCString:icalparameter_as_ical_string(m)]);
                m = icalproperty_get_next_parameter(p, ICAL_FBTYPE_PARAMETER);
            }

            p = icalcomponent_get_next_property(c, ICAL_FREEBUSY_PROPERTY);
        }

        c = icalcomponent_get_next_component(root, ICAL_VFREEBUSY_COMPONENT);
    }

    icalcomponent_free(root);
}

libical のドキュメントは、プロジェクトのダウンロード自体に含まれています (「参考文献」を参照UsingLibical.txt)。また、アプリケーション バンドルで libical を配布するための素敵なチュートリアルもあります。

于 2009-06-08T13:16:44.443 に答える
0

NSScannerを見てください。

于 2009-06-06T23:06:46.877 に答える