2009-06-05 5 views
1

Я ищу простой способ проанализировать данные VCALENDAR с объективом-c. В частности все меня беспокоит это данные FreeBusy (смотрите ниже):Parse VCALENDAR (ics) с Objective-C

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: @ «\ п», но есть \ п в части данных FreeBusy , заставляя его не разбираться правильно.

Есть ли что-то легкое, что мне не хватает?

ответ

7

\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 in your application bundle.