我正在寻找一种用Objective-C解析VCalendar数据的简便方法。具体而言,我关注的只是免费数据(见下文):

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

我尝试通过使用组件分隔bystring来解析它:@“ n”,但是一部分FreeBusy数据中有一个 n,导致它无法正确解析。

我缺少一些容易的东西吗?

有帮助吗?

解决方案

\n 在FreeBusy数据的中间,数据是ICalendar规范的一部分;根据 RFC 2445, ,纽线之后是一个空间,这是拆分长行的正确方法,因此您可能会在扫描FreeBusy数据中看到很多。

正如内森(Nathan)所建议的那样, NSScanner 如果您期望的数据将相当一致,则可能是您所需要的。不过,iCalendar有许多变化,所以我经常发现自己正在使用 诽谤 解析ICS信息。使用诽谤来解析此数据的快速范围示例:

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)。还有这个关于运输的可爱教程 您的应用程序包中的诽谤.

其他提示

看一眼 NSSCANNER.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top