xml解析

1.XML简介:

它是一种可扩展标记语言
用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
易读性高,编码手写难度小,数据量大


2.XML的两种解析方式

1 SAX(Simple API for XML)
只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
从文档的开始通过每一节点移动,定位一个特定的节点
2 DOM(Document Object Model)
不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
一般应用与小型的配置XML,方便操作
为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
在内存中生成节点树操作代价昂贵

iOS的NSXMLParser是SAX方法解析


3.解析过程:

1. 创建NSXMLParser实例,并传入从服务器接收的XML数据
2. 定义解析器代理
3. 解析器解析
4. 通过解析代理方法完成XML数据的解析




代码:

#pragma mark 解析XML
- (void)loadXML
{
    // 1. 从服务器获取数据 GET
    // 1) url
    NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast/videos.php?format=xml"];
    // 2) request
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
    
    // 3) 连接同步,可以让用户先有内容可看
    NSError *error;
    // NSData存放的是二进制的数据
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    
    // 2. XML解析
    // 1) 解析器
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 2) 设置代理
    parser.delegate = self;
    
    // 3)开始解析
    [parser parse];
}

#pragma mark - XML解析方法
// 1. 开始解析文档,在这里做初始化工作
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"开始解析文档");
    // 数组还没有被初始化,初始化数组
    _dataList = [NSMutableArray array];
    
    _elementString = [NSMutableString string];
}

// 2.3.4会循环执行,一直到XML文档解析完毕
// 2. 解析一个节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"节点开始 %@ %@", elementName, attributeDict);
    
    if ([elementName isEqualToString:@"video"]) {
        // 新建一个视频模型对象
        _currentVideo = [[Video alloc] init];
        
        // 取视频ID
        _currentVideo.videoId = [attributeDict[@"videoId"] integerValue];
    }
    
    // 清空拼接字符串
    [_elementString setString:@""];
}

// 3. 查找节点内容,可能会多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"开始查找内容 %@", string);
    // 拼接字符串
    [_elementString appendString:string];
}

// 4. 节点完成
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"节点完成 %@ %p", elementName, _elementString);
    
    NSString *result = [NSString stringWithString:_elementString];
    
    if ([elementName isEqualToString:@"video"]) {
        // 对象的属性填充完毕,添加到数组
        [_dataList addObject:_currentVideo];
    } else if ([elementName isEqualToString:@"length"]) {
        _currentVideo.length = [result integerValue];
    } else if (![elementName isEqualToString:@"videos"]) {
        // 利用KVC给字符串类型的属性赋值
        [_currentVideo setValue:result forKey:elementName];
    }
}

// 5. 解析完成,做收尾工作
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"解析完成");
    
    NSLog(@"%@", _dataList);
}

// 6. 解析出错,清理中间数据
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"%@", parseError.localizedDescription);
    
    // 一旦解析发生错误,需要把解析过程中生成的记录全部清除,以免造成不必要的麻烦
    [_dataList removeAllObjects];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值