Разбор VCALENDAR (ics) с Objective-C - PullRequest
2 голосов
/ 05 июня 2009

Я ищу простой способ для анализа данных VCALENDAR с целью-c. В частности, все, что меня интересует, это данные 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

Я попытался проанализировать его с помощью componentSeparatedByString: @ "\ n", но в части данных FREEBUSY есть \ n, из-за чего он не анализируется правильно.

Есть что-то простое, что мне не хватает?

Ответы [ 2 ]

8 голосов
/ 08 июня 2009

\n в середине данных FREEBUSY является частью спецификации iCalendar; в соответствии с RFC 2445 , новая строка, за которой следует пробел, является правильным способом разделения длинных строк, поэтому вы, вероятно, увидите много этого при сканировании данных FREEBUSY.

Как предполагает Натан, NSScanner может быть всем, что вам нужно, если ожидаемые данные будут достаточно последовательными. Однако в iCalendar есть ряд капризов, поэтому я часто использую libical для анализа информации. Краткий пример анализа этих данных с использованием 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 в комплекте приложений .

0 голосов
/ 07 июня 2009

Посмотрите на NSScanner .

...