加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml解析

发布时间:2020-12-16 00:11:39 所属栏目:百科 来源:网络整理
导读:1.XML简介: 它是一种可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 2.XML的两种解析方式 1 SAX(Simple API for 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",_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];
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读