zoukankan      html  css  js  c++  java
  • 解析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。。。
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/ianhao/p/4489855.html
Copyright © 2011-2022 走看看