• 解析xml && json


    XML

    DOM解析

    DOM:Document Object Model(文档对象模型)。解析时需要
    将XML文件整体读⼊,并且将XML结构化成树状,使用时再通过树 状结构读取相关数据
    XML完整读入才能解析,不能出现错误!

    SAX解析

    SAX:Simple API for XML。基于事件驱动的解析方式,逐行解析 数据。(采用协议回调机制)
    NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据。
    解析过程由NSXMLParserDelegate协议方法回调
    解析过程:开始标签->取值->结束标签->取值

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"xml"];
    #pragma mark     ---------SAX方式XML解析----------    
        //从XML文档的路径里面 获取到一个NSData类型的对象,当做初始化解析对的参数
        NSData *data = [NSData dataWithContentsOfFile:filePath];
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        parser.delegate = self;
        [parser parse];//开始启动解析的方法
    #pragma mark xmlparser    
    //step 1 :准备解析    
    - (void)parserDidStartDocument:(NSXMLParser *)parser    
    {    
    }    
    //step 2:准备解析节点    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict    
    {    
    NSLog(@"%@ 的开标签",elementName);
    }    
    //step 3:获取首尾节点间内容    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string    
    {      
     NSLog(@"%@",string); 
    }    
        
    //step 4 :解析完当前节点    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName    
    {     
    NSLog(@"%@ 的闭标签",elementName);
    }    
        
    //step 5:解析结束    
    - (void)parserDidEndDocument:(NSXMLParser *)parser    
    {    
    }    
    //step 6:获取cdata块数据    
    - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock    
    {    
    }    
    

    介绍一种第三方的xml解析类库,GDateXMLNode,这个类库是谷歌的

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"xml"];
        NSString *xmlStr = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        //根据xml的一个字符串(xmlStr),生成一个xm文档,文档里面包含了版本号,编码格式,根节点,叶节点,节点信息,还提供了方法,从文档中获取某个节点下地信息.
        //下面这个代码已经完成了xml解析,也就是说,后面的人名字的信息已经从整个字符串中抽离出来了.以节点内容的形式存放到了文档中    
    #pragma mark     ---------以文档的方式来整理----------  
        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];    
        //首先我得找到我的根节点 例如我们要从xml里面找一个name为安浩的
        GDataXMLElement *root = document.rootElement;
        //获取root下地所有孩子节点
        NSArray *children = [root children];   
        NSArray *children2 = [children[2] children];
        //这样的方式来找,还要我们知道xml文件的在第几个来找确定的值 一层一层的孩子找下去,个人感觉不是很方便的 
        //创建一个节点来保存 安浩姓名的节点   GDataXMLNode节点
        GDataXMLNode *anhao = children2[1];
        //打印安浩的姓名节点和安浩姓名的字符串
        NSLog(@"name is %@",anhao);  //节点
        NSLog(@"name is %@",[anhao stringValue]);  //字符串 
        // GDataXMLElement 获取元素的方式 
        GDataXMLElement *root = document.rootElement;
        NSArray *arr = [root elementsForName:@"teacher"];
        NSArray *arr2 = [arr[2] elementsForName:@"name"];  //注意的是即使知道这个位置就一个元素也不能用字符串获取
        NSLog(@"name is %@",[arr2[0] stringValue]);
        //forin遍历
        for(GDataXMLNode *node in [root children])
            for (GDataXMLNode *valueNode in [node children]) {
                NSLog(@"%@",[valueNode stringValue]);
            }   
        //绝对路径
        //1从根节点出发
        NSArray *arr = [root nodesForXPath:@"teacher/name" error:nil];
        NSLog(@"%@",[arr[2] stringValue]);
        
        //文档读取  绝对路径
        //2从文档出发
        NSArray *arr1 = [document nodesForXPath:@"teachers/teacher/name" error:nil];
        NSLog(@"%@",[arr1[2] stringValue]);
    
        //相对路径,从文档出发
        NSArray *arr2 = [document nodesForXPath:@"//name" error:nil];
        NSLog(@"%@",[arr2[2] stringValue]);
       */              
    

    Json解析

    //先读取本地的json文件
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"json"];
    #pragma mark --------系统自带的Json解析类NSJSONSerialization----
        //别看它只是简单地一句话,已经完成了Json解析的过程
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
        NSLog(@"%@",array);
        //通过解析Json数据得到的是一个字典,通过key找到key对应的数据数组,遍历数据数组中的字典,给我们的cell模型赋值 通过KVC
        NSDictionary *dic1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
        NSArray *arr1 = [dic objectForKey:@"result"];
        for (NSDictionary *dic in arr1) {
            <#statements#>
        }
       //直接解析Json得到就是个数组,并且数组保存的是一个个字典,便利数组中的字典,通过KVC 直接给cell模型赋值
        for (NSDictionary *dic in array) {        
            [xxx setValuesForKeysWithDictionary:dic];
        }
    #pragma mark --------第三方类库JSONKit解析Json数据----    
        //1.从一个(通过)NSDate对象解析得到数据容器
        //从文件路径中 得到一个NSDate对象
        NSData *data = [NSData dataWithContentsOfFile:filePath];
        NSArray *arr1 = [data objectFromJSONData];
    //    NSLog(@"arr1 is %@",arr1);    
        //2.从一个(通过)NSSting对象解析到得到数据容器
        NSString *str = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        NSArray *arr2 = [str objectFromJSONString];
        NSLog(@"%@",arr2);
    
    
    On the road。。。
  • 相关阅读:
    异常练习
    Comparator 排序 ArrayList 实操练习
    50道Java线程面试题
    Java ArrayList排序方法详解
    Map集合利用比较器Comparator根据Key和Value的排序
    Java Map 键值对排序 按key排序和按Value排序
    实现java随机数Random的几招
    如何在Java中获取键盘输入值
    力扣 ——3Sum python (三数之和)实现
    python中函数用法
  • 原文地址:https://www.cnblogs.com/ianhao/p/4489855.html
Copyright © 2020-2023  润新知