iOS中XML解析

iOS中XML解析分为两种实现方式:SAX与DOM
SAX方式:主要是事件驱动的解析方式,是逐行读取XML数据,不断回调代理,告诉代理当前解析的元素开始或者结束。
DOM解析方式:是讲整个XML数据全部读入内存,然后形成一颗树形结构,再根据元素的名称来读取相关的属性。
优缺点:
(1)SAX解析适合大型文件解析,对内存占用比较小,但是解析是采用事件驱动方式,因此代码比较零散复杂。
(2)DOM解析方式适合小型文件解析,代码实现非常简单,基本是按照元素名称来索引相关的属性。但是在解析大型文件的时候,由于是将XML数据全部读入内存,因此内存占用比较大。
1.下面首先介绍简单的DOM解析方式:使用google开源的GDataXML开源框架。
// 解析XML数据

    // 加载整个XML数据
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

    // 获得文档的根元素 -- videos元素
    GDataXMLElement *root = doc.rootElement;

    // 获得根元素里面的所有video元素
    NSArray *elements = [root elementsForName:@"video"];

    // 遍历所有的video元素
    for (GDataXMLElement *videoElement in elements) {
        HMVideo *video = [[HMVideo alloc] init];

        // 取出元素的属性
        video.id = [videoElement attributeForName:@"id"].stringValue.intValue;
        video.length = [videoElement attributeForName:@"length"].stringValue.intValue;
        video.name = [videoElement attributeForName:@"name"].stringValue;
        video.image = [videoElement attributeForName:@"image"].stringValue;
        video.url = [videoElement attributeForName:@"url"].stringValue;

        // 添加到数组中
        [self.videos addObject:video];
    }

2.使用SAX方式解析XML数据使用的是苹果自带的解析框架NSXMLParser框架
// 解析XML数据

    // 1.创建XML解析器 -- SAX -- 逐个元素往下解析
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 2.设置代理
    parser.delegate = self;

    // 3.开始解析(同步执行)
    [parser parse];

pragma mark - NSXMLParser的代理方法–
/**
* 解析到文档的开头时会调用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// NSLog(@”parserDidStartDocument—-“);
}

/**
* 解析到一个元素的开始就会调用
*
* @param elementName 元素名称
* @param attributeDict 属性字典
*/
- (void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict
{
if ([@”videos” isEqualToString:elementName]) return;

HMVideo *video = [HMVideo videoWithDict:attributeDict];
[self.videos addObject:video];

}

/**
* 解析到一个元素的结束就会调用
*
* @param elementName 元素名称
*/
- (void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName
{
// NSLog(@”didEndElement—-%@”, elementName);
}

/**
* 解析到文档的结尾时会调用(解析结束)
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// NSLog(@”parserDidEndDocument—-“);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值