美文网首页我爱编程
JSON/XML解析那点事儿

JSON/XML解析那点事儿

作者: 5c7a7cf606fc | 来源:发表于2016-05-28 14:00 被阅读123次
    • JSON是一种轻量级的数据格式,一般用于数据交互
    • 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)

    JSON的格式很像OC中的字典和数组

    {"name": "jack","age": 10}
    {"names": ["jack","rose","jim"]}

    • 标准JSON格式的注意点:key必须用双引号

    JSON的常见解析方案有4种

    • 第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越来越差)
    • 苹果原生(自带):NSJSONSerialization(性能最好)
    //JSON解析
    -(void)jsonTOOc
    {
        //1.确定url
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dewr&pwd=sfrsf&type=JSON"];
    
        //2.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //3.发送GET请求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    
            //4.解析JSON数据
            /*
             第一个参数:要解析的json数据
             第二个参数:解析策略
             NSJSONReadingMutableContainers = (1UL << 0), 最外层可变的数组或者是可变的字典
             NSJSONReadingMutableLeaves = (1UL << 1), string是可变的 iOS7有问题
             !!! NSJSONReadingAllowFragments = (1UL << 2) 最外层既不是数组也不是字典
             第三个参数:error
             */
            NSDictionary *dict =  [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    
            NSLog(@"%@",dict[@"error"]);
        }];
    }
    

    XML的常见解析方案

    • 全称是Extensible Markup Language,译作“可扩展标记语言”
    • 跟JSON一样,也是常用的一种用于交互的数据格式
    • 一般也叫XML文档(XML Document)

    XML举例

    <videos>
    <videoname="大圣归来"length="30"/>

    <videoname="三打白骨精"length="19"/>
    <videoname="哪吒闹海"length="33"/>
    </videos>

    XML的常见解析方案有两种

    • DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
    • SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

    在iOS中,解析XML的手段有很多

    • 苹果原生
      NSXMLParser:SAX方式解析,使用简单

    • 第三方框架
      libxml2:纯C语言,默认包含在iOSSDK中,同时支持DOM和SAX方式解析
      GDataXML:DOM方式解析,由Google开发,基于libxml2

    XML解析方式的选择建议

    p大文件:NSXMLParser、libxml2
    p小文件:GDataXML、NSXMLParser、libxml2

    用NSXMLParser解析XML

    //1.确定请求路径
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
    
        //2.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //3.使用NSURLConnection发送GET请求(异步)
        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    
            //4.解析服务器返回的数据
    //        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    
            //4.1 创建一个XML解析器
            NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    
            //4.2 设置代理
            parser.delegate = self;
    
            //4.3 开始解析
            [parser parse];
    

    一些常用的代理方法

    pragma mark - NSXMLParserDelegate
    //1.开始解析XML文档
    -(void)parserDidStartDocument:(NSXMLParser *)parser
    {
        NSLog(@"parserDidStartDocument");
    }
    //2.开始解析XML文档中的某个元素,会被调用多次
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
    {
    
        //判断是否是根元素
        if ([elementName isEqualToString:@"videos"]) {
            return;
        }
         NSLog(@"didStartElement---%@---%@",elementName,attributeDict);
    
        //字典转模型
        //[self.videos addObject:[ZYHVideo mj_objectWithKeyValues:attributeDict]];
    
        //第二种方式:
        ZYHVideo *video = [[ZYHVideo alloc]init];
        [video mj_setKeyValues:attributeDict];
        [self.videos addObject:video];
    }
    //3.结束解析XML文档中的某个元素,会被调用多次
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
         NSLog(@"didEndElement---%@",elementName);
    }
    //4.解析XML文档结束
    -(void)parserDidEndDocument:(NSXMLParser *)parser
    {
         NSLog(@"parserDidEndDocument");
    }
    

    使用GDataXML解析XML

    • GDataXML基于libxml2库,得做以下配置
    • 导入libxml2库
    • 设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
    • 在Head SearchPath中加入/usr/include/libxml2
    • 设置链接参数(自动链接libxml2库)
    • 由于GDataXML是非ARC的,因此得设置编译参数
    //1.确定请求路径
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
    
        //2.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //3.使用NSURLConnection发送GET请求(异步)
        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    
            //4.解析服务器返回的数据
            //4.1 加载XML文档
            GDataXMLDocument *doc=  [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
    
            //4.2 需要拿到这个XML文档的根元素,拿到根元素下面的所有名称为video的子元素
            NSArray *eles =  [doc.rootElement elementsForName:@"video"];
    
            //4.3 遍历eles ,完成数据的转换
            for (GDataXMLElement *ele in eles) {
    
                XMGVideo *video = [[XMGVideo alloc]init];
    
                video.name = [ele attributeForName:@"name"].stringValue;
                video.ID = [ele attributeForName:@"id"].stringValue;
                video.image = [ele attributeForName:@"image"].stringValue;
                video.url = [ele attributeForName:@"url"].stringValue;
                video.length = [ele attributeForName:@"length"].stringValue.integerValue;
    
                [self.videos addObject:video];
            }
    
                   //6.在主线程中刷新UI-TableView
            [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                 [self.tableView reloadData];
            }];
        }];
    

    相关文章

      网友评论

        本文标题:JSON/XML解析那点事儿

        本文链接:https://www.haomeiwen.com/subject/ivcfdttx.html