• 数据解析(SAX, JSON)


    数据解析(SAX, JSON)

        为了方便客户端和服务端进行数据的传递, 会对数据的格式进行限定, 主流的数据格式:

        XML: Extensible Marup Language, 可扩展标记语言

        XML数据的特点

        1.有一个根节点

        2.每一个节点, 都有一个父节点和多个子节点

        3.如果一个节点没有父节点, 叫根节点

        4.如果一个节点没有子节点, 叫叶节点

        5.每一个节点都由一个开始标签<>和一个结束标签</>

        6.数据存放在开始标签和结束标签之间

        解析: 从数据中提取有用的信息的过程

        XML的解析方式:

        1.SAX: 逐行解析(读一行, 解析一行), 效率比较低, 遇到错误时, 错误之前的数据都能解析

        2.DOM: 整篇解析(整篇内容读完, 再解析), 效率比较高, 遇到错误, 无法解析

       

        JSON: Javascript Object Natation, 最理想的数据格式

        JSON数据的特点

        1.由数组和字典组成

        2.数组用[]表示

        3.字典用{}表示

        4.数组中的元素, 用逗号隔开

        5.字典中的键值对用逗号隔开

        6.字符串要加双引号

        JSON的解析途径

        1.apple

        2.第三方

                                                                

    SAX解析

    解析文件
    Student.xml
    <Students> <student> <name>蹦蹦</name> <age>24</age> <gender>男</gender> </student> <student> <name>张三</name> <age>18</age> <gender>女</gender> </student> <student> <name>李四</name> <age>20</age> <gender>男</gender> </student> </Students>
    - (IBAction)sax:(UIButton *)sender {
      NSXMLParser, XML解析类, sax方式, 继承于NSObject  
        //文件的路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
        //NSURL, 统一资源定位符
        NSURL *url = [NSURL fileURLWithPath:path];
        //创建解析类
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        //设置代理, 解析的过程在delegate方法中实现
        parser.delegate = self;
        //开始解析
        [parser parse];
        //释放
        [parser release];
    }

    遵守协议

    #pragma mark - NSXMLParserDelegate
    - (void)parserDidStartDocument:(NSXMLParser *)parser {
        NSLog(@"文档已经开始解析");
        self.studentArray = [NSMutableArray arrayWithCapacity:3];
    }
    
    - (void)parserDidEndDocument:(NSXMLParser *)parser {
        NSLog(@"文档已经结束解析");
        NSLog(@"%@", self.studentArray);
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
        NSLog(@"遇到开始标签%@", elementName);
        if ([elementName isEqualToString:@"student"]) {
            student = [[Student alloc] init];
        }
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
         NSLog(@"遇到结束标签%@", elementName);
        if ([elementName isEqualToString:@"name"]) {
            student.name = _content;
        } else if ([elementName isEqualToString:@"age"]) {
            student.age = _content;
        } else if([elementName isEqualToString:@"gender"] ){
            student.gender = _content;
        } else if([elementName isEqualToString:@"student"]){
            [self.studentArray addObject:student];
            NSLog(@"%@", student);
            [student release];
        }
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
        NSLog(@"遇到内容%@", string);
        self.content = string;
    }
    
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
        NSLog(@"解析出现错误%@", parseError);
    }
    @end
    DOM解析类: GDataXMLNode, google提供的DOM解析类
    第三方: 除去你和苹果官方的其他代码: Third Part, Vender   
    第三方的获取途径
    http://www.code4app.com
    http://cocoaChina.com
    https://github.com
    第三方使用的步骤
    1.导入工程
     2.配置环境(optional) 
    a.导入框架
    根据头文件里给的信息修改配置环境


    b.配置工程参数
    双击右边添加参数




    3.引入头文件

    - (IBAction)dom:(UIButton *)sender {获取文件路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
        根据文件路径, 找到文件, 读取文件内容
        //注: 默认MaxOS下地文字编码格式是UTF-8
        NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"%@", content);
        GDataXMLDocument: 用于读取文档
        NSError *error = nil;
        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:&error];
        内容读完以后, 可以分析出整个XML数据的结构
        
        //找根节点
        GDataXMLElement *rootElement = [document rootElement];
        //通过节点名, 找子节点
        NSArray *elements = [rootElement elementsForName:@"student"];
        self.studentArray = [NSMutableArray arrayWithCapacity:3];
        //遍历节点数组
        for (GDataXMLElement *ele in elements) {
            //创建学生对象
            Student *stu = [[Student alloc] init];
            //赋值
            stu.name =  [[[ele elementsForName:@"name"] firstObject] stringValue];
            stu.age = [[[ele elementsForName:@"age"] firstObject] stringValue];
            stu.gender = [[[ele elementsForName:@"gender"] firstObject] stringValue];
            //添加到数组中
            [self.studentArray addObject:stu];
            //释放
            [stu release];
        }
        NSLog(@"%@", self.studentArray);
        
        XPath: 路径检索
        GDataXMLNode是支持XPath的
        // /: 绝对路径 @"student/name"  //: 相对路径 @"//name"
        NSArray *names = [rootElement nodesForXPath:@"//name" error:nil];
        for (GDataXMLElement *ele in names) {
             NSLog(@"%@", [ele stringValue]);
        }
    }

    JSON方法

    解析文件
    Student.json [ {
    "name": "强强", "age": "18", "gender": "" }, { "name": "蹦蹦", "age": "28", "gender": "" }, { "name": "忠忠", "age": "38", "gender": "" } ]

    apple方法

    - (IBAction)apple:(UIButton *)sender {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
        NSData, 二进制数据, 继承于NSObject
        NSData *data = [NSData dataWithContentsOfFile:path];
        NSJSONSerialization, JSON解析类(序列化), 继承于NSObject
        参数1: 二进制数据
        参数2: options: NSJSONReadingOptions:
        NSJSONReadingMutableContainers, 生成的数组和字典是可变的
        NSJSONReadingMutableLeaves, 生成的字符串是可变的
        NSJSONReadingAllowFragments, 允许最外层不是数组或字典
        NSError *error = nil;
        NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
        if (error) {
             NSLog(@"%@", error);
        } else {
            NSLog(@"%@", array);
        }
        
        //数据的封装
        self.studentArray = [NSMutableArray arrayWithCapacity:3];
        for (NSMutableDictionary *dic in array) {
            //1
    //        Student *stu = [[Student alloc] init];
    //        stu.name = dic[@"name"];
    //        stu.age = dic[@"age"];
    //        stu.gender = dic[@"gender"];
            
            2.KVC
            Student *stu = [[Student alloc] init];
            [stu setValuesForKeysWithDictionary:dic];
            NSLog(@"%@", stu);
            
            [self.studentArray addObject:stu];
            [stu release];
        }
        NSLog(@"%@", _studentArray);
    }

    JSON第三方方法

    添加文件, 引入头文件

          

    - (IBAction)vendor:(UIButton *)sender {
        //获取文件路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
        //获取二进制数据
        NSData *data = [NSData dataWithContentsOfFile:path];
        NSArray *array = [data objectFromJSONData];
        NSLog(@"%@", array);
    }

     

  • 相关阅读:
    HDU 4757 Tree 可持久化字典树 trie
    BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
    BZOJ 3253 Fence Repair 哈夫曼树 水题
    BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp
    2-SAT的一些题目
    二分图相关定理 最小点覆盖 最小路径覆盖 最大独立集 最小覆盖集
    POJ 1469 COURSES 二分图最大匹配 二分图
    快速排序
    排序算法:希尔排序
    霍夫曼编码实现
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4951201.html
Copyright © 2020-2023  润新知