首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Objective-C解析VCALENDAR (ics)

用Objective-C解析VCALENDAR (ics)
EN

Stack Overflow用户
提问于 2009-06-05 08:01:30
回答 2查看 5.3K关注 0票数 2

我正在寻找一种使用objective-c解析VCALENDAR数据的简单方法。具体地说,我只关心FREEBUSY数据(见下文):

代码语言:javascript
复制
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:@" \n“来解析它,但是在FREEBUSY数据的一部分中有一个\n,导致它不能正确解析。

我是不是遗漏了什么简单的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-08 13:16:44

FREEBUSY数据中间的\n是iCalendar规范的一部分;根据RFC 2445的说法,换行符后跟空格是拆分长行的正确方式,所以在扫描FREEBUSY数据时可能会看到很多这样的情况。

正如Nathan建议的那样,如果您期望的数据保持合理的一致性,那么NSScanner可能就是您所需要的一切。然而,iCalendar中有许多变幻莫测的东西,所以我经常发现自己使用libical来解析ics信息。使用libical解析此数据的快速示例:

代码语言:javascript
复制
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的可爱的教程。

票数 8
EN

Stack Overflow用户

发布于 2009-06-06 23:06:47

看看NSScanner吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/954750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档