2009-06-05 4 views
1

Ich bin auf der Suche nach einer einfachen Möglichkeit, VCALENDAR Daten mit objective-c zu analysieren. Insbesondere alles, was ich besorgt bin mit ist die FreeBusy Daten (siehe unten):Parse VCALENDAR (ics) mit 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 

Ich habe versucht, es Parsen von componentsSeparatedByString mit: @ „\ n“, aber es ist ein \ n in einem Teil der FreeBusy Daten , wodurch es nicht korrekt analysiert wird.

Gibt es etwas Leichtes, dass ich vermisse?

Antwort

7

Die \n in der Mitte von FREEBUSY-Daten ist ein Teil der iCalendar-Spezifikation; Laut RFC 2445 ist der Zeilenumbruch, gefolgt von einem Leerzeichen, der richtige Weg, um lange Zeilen zu trennen. Sie werden wahrscheinlich eine Menge davon sehen, wenn Sie FREEBUSY-Daten scannen.

Wie Nathan vorschlägt, könnte ein NSScanner alles sein, was Sie brauchen, wenn die Daten, die Sie erwarten, einigermaßen konsistent sein werden. Es gibt jedoch eine Reihe von Launen in iCalendar, so dass ich oft libical zum Parsen von ics-Informationen benutze. Ein schnelles und unsauberes Beispiel dieser Daten zu parsen mit 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); 
} 

Dokumentation für libical ist im Projekt-Download selbst (siehe UsingLibical.txt). Es gibt auch dieses schöne Tutorial zum Versand libical in your application bundle.