网络解析数据

json解析数据

以下是苹果自带的数据解析的方式, 也是最常用的解析方式

//     json数据特点:
//     中括号表示: 数组
//     大括号表示: 字典
   
    // 1. 获取路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher.json" ofType:nil];

    // 2. 转化成data
    NSData *data = [NSData dataWithContentsOfFile:path];
   
    // 3. 利用data转化成可变数组 或者可变字典, 是构造成数组还是可变字典, 看数据最外层是啥
    NSMutableArray *dataArr = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
    // 注意字典中各数据的类型, 若程序崩溃, 首先查看字典中的数据类型和model中的类型是否一致
    NSMutableArray *modelArr = [NSMutableArray array];
    for (NSDictionary *dic in dataArr) {
        TeacherModel *model = [[TeacherModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        [modelArr addObject:model];
    }




XML数据解析


// 利用GDDataXMLNode进行DOM解析
- (void)setUpGDDataXML {
    // 获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher.xml" ofType:nil];
   
    // 转化成NSData
    NSData *data = [NSData dataWithContentsOfFile:path];
   
    //  用Data初始化一个对象,
    //  DOM解析一次性读取文件中所有信息
    //  把data转化成GDataXMLDocument这个类可以操作的对象
   
    //error:<#(NSError **)#>: 构建一个空的错误对象
//    // 想得到错误信息:
//    NSError *error = nil;
//    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
    // 不想得到错误信息:
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
   
    // 获取根节点, 以及中间所有的节点, GDataXMLElement表示节点
    GDataXMLElement *rootElement = [document rootElement];
   
    // 获取teacher的三个节点的数组
    NSArray *subArray = [rootElement children];
   
    self.dataArr = [NSMutableArray array];
   
    // 遍历这个数组
    for (int i = 0; i < subArray.count; i++) {
        // 相当于一个teacher
        GDataXMLElement *oneElement = subArray[i];
        NSString *name = [self forinArr:oneElement string:@"name"];
        NSString *gender = [self forinArr:oneElement string:@"gender"];
        NSString *age = [self forinArr:oneElement string:@"age"];
       
        // 初始化一个model
        TeacherModel *model = [[TeacherModel alloc] init];
        model.name = name;
        model.gender = gender;
        model.age = age;
        [self.dataArr addObject:model];
    }

}

- (void)setUpData {
    // 获取xml文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher.xml" ofType:nil];
   
    //[[NSXMLParser alloc] initWithData:(NSData *)], NSData 是转化二进制的类
    // 把该路径的文件转化成二进制
    NSData *data = [NSData dataWithContentsOfFile:path];
   
    // 创建XML分析器类
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
   
    // 设置代理
    parser.delegate = self;
   
    // 注意!!!!! 要开启分析
    [parser parse];
   
    [parser release];
}

#pragma mark 分析器开始分析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"触发分析器, 已经开始分析文件");
    // 初始化数组:
    // 1. 只初始化一次;   2. 一开始就触发
    self.dataArr = [NSMutableArray arrayWithCapacity:1];
   
}

#pragma mark 遇到节点就触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    //NSLog(@"遇到节点就触发");
    NSLog(@"<%@>", elementName);
    // 判断节点是不是teacher. 若是, 就初始化一个model
    if ([elementName isEqualToString:@"Teacher"]) {
        self.model = [[TeacherModel alloc] init];
    }
}

#pragma mark 找到内容时触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"%@", string);
    // 保存字符串, 不管数是空格, 还是有用字符串
    self.string = string;
}

#pragma mark 找到节点结束时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"</%@>", elementName);
    // 如果遇到name结束, 就将保存的字符串赋值给model
    if ([elementName isEqualToString:@"name"]) {
        self.model.name = self.string;
    } else if ([elementName isEqualToString:@"gender"]) {
        self.model.gender = self.string;
    } else if ([elementName isEqualToString:@"age"]) {
        self.model.age = self.string;
    } else if ([elementName isEqualToString:@"Teacher"]) {
        // 如果遇到Teacher, 就说明model赋值结束了
        [self.dataArr addObject:self.model];
    }
}

#pragma mark 结束分析
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"结束分析");
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值