【问题标题】:Parse VCALENDAR (ics) with Objective-C使用 Objective-C 解析 VCALENDAR (ics)
【发布时间】:2009-06-08 21:16:44
【问题描述】:

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

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,导致它无法正确解析。

我错过了什么简单的东西吗?

【问题讨论】:

    标签: objective-c parsing icalendar vcalendar


    【解决方案1】:

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

    正如 Nathan 所建议的,如果您期望的数据相当一致,NSScanner 可能就是您所需要的。不过,iCalendar 中有许多变幻莫测,所以我经常发现自己使用libical 来解析 ics 信息。使用 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

    【讨论】:

      【解决方案2】:

      看看NSScanner

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2010-11-21
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多