zoukankan      html  css  js  c++  java
  • iOS学习之数据解析

    解析:按照约定好的格式提取数据的过程叫做解析;
    后台开发人员按照约定好的格式存入数据,前端开发人员按照约定的格式读取数据;
    主流的格式: XML / JSON 前端和后台都能识别的格式; 

    XML解析
    XML解析的两种工作原理:
    1.SAX解析:基于事件回调的解析机制,逐行进行解析,效率低,适合于大数据解析.  系统提供的NSXMLParser.
    1.将通过网络请求或者本地路径获取到的数据存储为NSData对象.
    2.创建解析工具
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    3.设置代理
    xmlParser.delegate = self;
    4.开始解析
    [xmlParser parse];
    [xmlParser release];
    
    
    #pragma mark - delegate
    
    //当读取到标签后的内容时触发
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
        NSLog(@"读取到内容%@", string);
        //用属性str存储读取到的标签内容;
        _str = string;
    }
    //当读取到开始标签时触发
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
        NSLog(@"开始标签");
        if ([elementName isEqualToString:@"Student"]) {
            //当读取到开始标签时,创建Student对象.
            self.stu = [[[StudentModel alloc] init] autorelease];
            //attributeDict 存储节点的属性值
            self.stu.position = attributeDict[@"position"];
        }
        
    }
    //当读取到结束标签时触发</Student>
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        NSLog(@"结束标签");
        if ([elementName isEqualToString:@"name"]) {
            self.stu.name = self.str;
        } else if ([elementName isEqualToString:@"gender"]) {
            self.stu.gender = self.str;
        } else if ([elementName isEqualToString:@"age"]) {
            self.stu.age = self.str;
        } else if ([elementName isEqualToString:@"motto"]) {
            self.stu.motto = self.str;
        } else if ([elementName isEqualToString:@"Student"]) {
            //读取到Student结束标签时,将Student对象存储到数组中
            [self.dataSource addObject:_stu];
        }
    }
    
    //当解析完毕时触发
    - (void)parserDidEndDocument:(NSXMLParser *)parser {
        NSLog(@"解析完毕");
        //当解析完毕时,让tableView重新刷新一下数据
        [self.tableView reloadData];
    }
    2.DOM解析:把解析数据读入内存,初始化生成树形结构,逐层进行解析.效率高,适合于小数据解析. 谷歌提供的GDataXMLNode. 
     
    解析工具:
    GDataXMLNode  是由Google提供的开源的基于C语言的libxml2.dylib动态链接库而封装的OC的XML解析类,效率比较高. 采用DOM解析的原理.
    使用GDataXML Nod步骤:
    1.target — Build Phases - Link Binary 添加libxml2.dylib
    2.target — Build Setting — 搜索 Header Search path 添加 /usr/include/libxml2
     
    libxml2.dylib 与 libxml2.2.dylib的区别:
    前者是一个快捷方式,永远指向的是最新的类库,而后者才是真实的类库,使用前者有一个好处,当类库更新时,我们老版本的项目无需再重新导入新的类库. 

     
    JSON解析:
    JsonKit 是通过给NSString, NSData添加分类的形式,增加解析功能.
     
    //系统提供的解析JSON方法
    - (void)handleSystemParser:(UIBarButtonItem *)item {
        //1.获取文件路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
        //2.根据文件路径初始化NSData对象
        NSData *data = [NSData dataWithContentsOfFile:filePath];
        //解析
        NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@", arr);
    
    }

    //
    第三方类库解析JSON方法(这里使用JSONKit) - (void)handleThirdPartParser:(UIBarButtonItem *)item { //将Json格式数据转化为OC对象(NSString对象)

    //1.获取文件路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"]; //2.根据文件路径初始化字符串对象 NSString *dataStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //3.解析成OC对象.(可变对象/不可变对象) NSArray *arr1 = [dataStr objectFromJSONString]; NSArray *arr2 = [dataStr mutableObjectFromJSONString]; NSLog(@"%@",arr1); NSLog(@"%@", arr2);

      }

    选择了解---

    当然,也可以解析成NSData对象,第一步的方法都一样,获取文件路径

    - (void)handleThirdPartParser:(UIBarButtonItem *)item {
        
        //将Json格式数据转化为OC对象(NSData对象)
    
        //1.获取文件路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    
         //根据文件路径初始化成NSData对象
         NSData *data = [NSData dataWithContentsOfFile:filePath];
         //解析.(可变/不可变)
         NSArray *arr1 = [data objectFromJSONData];
         NSMutableData *arr2 = [data mutableObjectFromJSONData];

    以上是将JSON数据转为OC的对象,下面是讲OC对象转为JSON数据的方法.

        //将OC对象转成JSON格式数据.
    
        //1.将OC的数组对象转成JSON格式数据.
        NSArray *arr1 = @[@"aa",@"bb",@"cc",@"dd"];
        NSData *jsonData1 = [arr1 JSONData];//转成JSON格式Data
        NSString *jsonStr1 = [arr1 JSONString]; //转成JSON格式String
        
        //2.将OC的字典对象转成JSON格式数据.
        NSDictionary *dic2 = @{@"name":@"Frank",
                               @"age":@"18"
                               };
        NSData *jsonData2 = [dic2 JSONData];//转成JSON格式Data
        NSString *jsonStr2 = [dic2 JSONString];//转成JSON格式String
  • 相关阅读:
    Appium问题解决方案(2)- AttributeError:module 'appium.webdriver' has no attribute 'Remote'
    Azure Messaging-ServiceBus Messaging消息队列技术系列8-服务总线配额
    Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务
    Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执
    Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once
    Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化
    Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证
    [博客迁移]探索Windows Azure 监控和自动伸缩系列3
    [博客迁移]探索Windows Azure 监控和自动伸缩系列2
    [博客迁移]探索Windows Azure 监控和自动伸缩系列1
  • 原文地址:https://www.cnblogs.com/ErosLii/p/4511702.html
Copyright © 2011-2022 走看看