我爱编程

XML解析

2018-02-27  本文已影响0人  墨竹AI

一 XML简介

XML曾经是最流行,出身名门,W3C主推,IBM,微软 是一门可拓展"标记语言"

<标记></标记>
<标记>标记内容</标记>
<标记 属性1="属性"属性2="属性2">标记内容</标记>

特点:


二 解析方式

1 DOM MAC提供的解析方法,iOS中无法直接使用
- 原因:内存开销巨大!
- 可读可写
- 将数据已树形结构加载到内存
2 SAX iOS提供的解析方式
- 内存开销小
- 只读
- 速度快
- 从上到下,顺序解析的过程
- 读取到所需信息后可以随时停止

三 SAX解析的过程

1.打开文档(准备)
2.开始节点

    <videos>
        <video videoId="1">
            <name>
            <length>

3.发现节点内容(一个节点内容,可能会读取很多次!)

        01.C
        语言-
        语法预览
        320
        ....

4.结束节点

          </name>
        </length>
        ....
    </video>
   </videos>     (最后一个节点)  判断文档是否解析结束,如果没有就继续

5.文档解析完成!

在实际开发中,XML的解析是用过NSXMLParser的对象来实现!具体的实现过程,是通过"五个代理"方法不断循环,来完成XML解析!


四 解析框架

1.苹果原生

NSXMLParser:SAX方式解析
五个代理方法

2.第三方框架

libxml2 :纯C语言的框架,默认是包容iOS SDK ,同时支持DM,SAX方法解析,

GDataXMLLDom 解析,基于libxml2

五 5个代理方法

#pragma mark --<XML解析代理方法>
//1.打开文档
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"1.开始文档");
    
    //1.清空数组
    [self.videos removeAllObjects];
}
//2.开始节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
    //elementName 节点名称
    //namespaceURI 命名空间
    //qualifiedName 命名空间限定的本地名称
    //attributes 属性
    
    NSLog(@"2.开始节点 %@ %@",elementName,attributeDict);
    
    
    if ([elementName isEqualToString:@"video"]) {
        
        //1.新建模型
        self.currentVideo = [[Video alloc]init];
        
        //2设置videoID的属性
        self.currentVideo.videoId = @([attributeDict[@"videoId"]intValue]);
    
        
    }
    
}

//3.发现节点内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //拼接字符串
    NSLog(@"==> %@",string);
    [self.elementStr appendString:string];
    
}

//4.结束节点
/*
    kvc
 */
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"4.结束节点:%@",elementName);
    
    if ([elementName isEqualToString:@"video"]) {
        
        [self.videos addObject:self.currentVideo];
        
    }else if (![elementName isEqualToString:@"videos"])
    {
        [self.currentVideo setValue:self.elementStr forKey:elementName];
        
    }
    //清空字符串
    [self.elementStr setString:@""];
    
}

//5.结束解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"5.结束解析!%@",self.videos);
}


//6.出现错误(主要是网络开发,就需要对出错进行处理)
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    
    NSLog(@"发生错误");
    
}

上一篇 下一篇

猜你喜欢

热点阅读