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(@"结束分析");
}
}