• iOS进阶(XML、JSON数据解析)


    1.XML解析之DOM解析

    需要用到libxml2.dylib框架 和GDataXMLNode工具

    DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据

     //获取XML文件路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"];
        //从文件路径中提取文档数据
        NSData *data = [NSData dataWithContentsOfFile:filePath];
        
        //这行代码执行完之后,我们队xml文档的解析已经成功了,在document中保存的是xml文档的版本号,编码格式,根节点,叶节点等所有文档信息,我们想要的数据,只要对document进行处理就可以拿到
        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
        
        //XML数据的读取是以栈的形式管理的
        
        //从xml格式的数据获取模型的方法
        /*
         for (GDataXMLElement *element in array) {
         Person *person = [[Person alloc] init];
         for (GDataXMLElement *element1 in [element children]) {
         [person setValue:[element1 stringValue] forKey:[element1 name]];
         }
         [mArr addObject:person];
         }
         
         
        
        /*
        //获取瘪犊子
        //1,在document找到根节点对象
        GDataXMLElement *root = document.rootElement;
        
        //获取根节点下所有的子节点对象
        NSArray *array = [root children];
        
        //获取目标数据所在的节点对象
        GDataXMLElement *teacher = [array objectAtIndex:1];
        
        //获取目标对象的所有子节点
        NSArray *arr = [teacher children];
        
        //取出结果
        NSLog(@"%@",[arr[0] stringValue]);
      */
        
        /*
        //获取瘪犊子
        //第二种
        GDataXMLElement *root = document.rootElement;
    
        NSArray *array = [root elementsForName:@"Teacher"];
        NSLog(@"array is %@",array);
        NSArray *arr = [array[1] elementsForName:@"name"];
        NSLog(@"%@",[arr[0] stringValue]);
        */
        
        /*
        //获取瘪犊子
        //第三种(通过节点路径找到具体某个内容)
        //(1)从document触发,绝对路径
        NSArray *array = [document nodesForXPath:@"Teachers/Teacher/name" error:nil];
        NSLog(@"%@",[array[1] stringValue]);
        
        //(2)从根节点出发
        NSArray *array1 = [document.rootElement nodesForXPath:@"Teacher/name" error:nil];
        NSLog(@"%@",[array1[1] stringValue]);
        
        //(3)从document出发,相对路径
        NSArray *array2 = [document nodesForXPath:@"//name" error:nil];
         NSLog(@"%@",[array2[1] stringValue]);*/

    2.XML解析之SAX解析

    采用协议回调机制,逐行进行解析

        NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"];
        NSData *data1 = [NSData dataWithContentsOfFile:path];
        
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data1];
        
        //既然SAX解析是基于时间回调机制的,所以需要指定解析器的代理
        //实现代理方法
        parser.delegate = self;
        
        [parser parse];
        
        
        NSLog(@"%@",document);
        
    
    //开标签--内容--闭标签--内容--开标签--内容--闭标签
    
    //遇见开标签执行的方法
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
        NSLog(@"%@的开标签",elementName);
    }
    
    //遇见节点携带的内容是执行的方法
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        NSLog(@"%@",string);
    
    }
    
    //遇见闭标签是执行的方法
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        NSLog(@"%@的闭标签",elementName);
    
    }

    3.JSON数据解析

    //获取文件路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"txt"];
        //获取数据
        NSData *data = [NSData dataWithContentsOfFile:filePath];
    //    self.dataArray = [NSMutableArray arrayWithCapacity:0]; //用懒加载代替
        //开始解析(最外面是声明就用什么接收)
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
        for (NSDictionary *dic in array) {
            NSArray *resultArray = dic[@"data"];
            NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:0];
            for (NSDictionary *dictionary in resultArray) {
                Movie *movie = [[Movie alloc] init];
                [movie setValuesForKeysWithDictionary:dictionary];
                [mArr addObject:movie];
                
            }
            [self.dataDic setObject:mArr forKey:dic[@"title"]];
        }
        NSLog(@"dataDic is %@",self.dataDic);
  • 相关阅读:
    拼音输入法的数学原理
    搜索核心原理之网页和查询的相关性——TF-IDF
    Linux内核源码分析之调度、内核线程模型 And Centos7.2's Kernel Resource Analysis
    手把手教您定制化Centos6.x安装界面
    定制Centos系统(基于6.x)
    数据分析、数据挖掘之聚类、分类
    数据分析、数据挖掘之文档过滤、垃圾邮件
    数据分析、数据挖掘之特征分解、特征分析
    数据挖掘、数据分析之协同过滤、推荐系统、关联分析
    转载-“一代宗师”周金涛先生20个预言待验证
  • 原文地址:https://www.cnblogs.com/w150385/p/5251877.html
Copyright © 2020-2023  润新知