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);

 

posted on 2016-03-07 20:56  无吸收力丶  阅读(176)  评论(0编辑  收藏  举报