2009-06-05 13 views
1

私は、VCALENDARデータをobjective-cで解析する簡単な方法を探しています。 「N \」@ますが、\ nはFREEBUSYデータの一部であります。私はcomponentsSeparatedByStringを使用して、それを解析しようとしましたObjective-CでVCALENDAR(ics)を解析する

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 

:具体的に私はと心配すべてがFREEBUSYデータである(以下を参照してください)正しく解析されません。

私は行方不明のものがありますか?

答えて

7

FREEBUSYデータの中の\nは、iCalendar仕様の一部です。 RFC 2445によれば、改行の後ろにスペースが続くのは、長い行を分割する正しい方法です。したがって、FREEBUSYデータをスキャンする際にこのようなことが多く見られます。

Nathanが示唆しているように、期待しているデータが合理的に一貫している場合には、NSScannerが必要なだけかもしれません。しかし、iCalendarにはいくつかのバグがありますので、私はしばしばlibicalを使ってicsの情報を解析しています。な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); 
} 

ドキュメント(UsingLibical.txtを参照)プロジェクトのダウンロードそのものです。 libical in your application bundleの出荷についてのこの素敵なチュートリアルもあります。