IOS 学习笔记(Parse XML with GDataXMLNote)PART 5

本来我期望iOS原生的包里,有像NSJSONSerialization一样方便的,用于解析XML的工具,于是找到了NSXMLParser,结果发现它并不是一个完整的解析工具,而是一个需要手动实现解析细节的包,它只是负责逐个遍历节点,具体的装箱工作要我自己手动来达成,这也太不方便了~除非我要解析什么特定格式的数据,否则真是好麻烦啊,尤其它是需要通过实现 Delegate的方式实现,真的很不习惯。

于是找到了gdata-objectivec-client,是Google的开源项目,配置过程如下:

  • svn它的源代码,拷贝源码中XMLSupport文件夹下的两个文件到项目中:

  • 为项目添加所需的libxml2.dylib库,打开配置项目配置页面–>Build Phases–>Link Binary With Libraries,用左下角的加号按钮添加库文件,输入libxml2,找到并添加它。

  • 在工程的“Build Settings”页中找到“Header Search Path”项,添加/usr/include/libxml2”到路径中

  • 然后添加“GDataXMLNode.h”文件到头文件中,此时编译如果遇到ARC错误,可以在Build Phases -> Compile sources,选择需要的文件,在右边Compile Flags输入-fno-objc-arc

自此,这个包已经可以正常工作了,不由得擦擦头上的汗,回想一下在AS项目里加一个swc是讷么地轻松,不过我认为随着XCode的发展,一定会有更方便的办法出现的。

下面就是代码解析的部分我的目标是用treehouse的示例代码显示我自己Blog的RSS,解析XML的部分代码如下:

    NSURL *blogURL = [NSURL URLWithString:@"http://www.hector2.us/?feed=rss2"];

    NSData *blogData = [NSData dataWithContentsOfURL:blogURL];
    GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithData:blogData options:0 error:nil];
    GDataXMLElement *rootElement = [xmlDoc rootElement];
    NSArray *channels = [rootElement elementsForName:@"channel"];
    GDataXMLElement *firstChannel =channels[0];
    NSArray *items = [firstChannel elementsForName:@"item"];

    self.blogPosts = [NSMutableArray array];

    for (GDataXMLElement *element in items) {

        NSArray *titles = [element elementsForName:@"title"];
        NSString *title = [(GDataXMLElement *)[titles objectAtIndex:0] stringValue];
        BlogPost *bp = [BlogPost blogPostWithTitle:title];
        NSArray *links = [element elementsForName:@"link"];
        NSString *link = [(GDataXMLElement *)[links objectAtIndex:0] stringValue];
        bp.url = [NSURL URLWithString:link];
        [self.blogPosts addObject:bp];
    }