IOS数据解析主要有XML解析和JSON解析两种方式,下面以本地数据的方式来说明这两种方式
XML解析
下面是一段简单不完整的XML代码
<Teachers>
<Teacher>
<name>草哥</name>
<gender>男</gender>
<age>24</age>
</Teacher>
<Teacher>
<name>好贱</name>
<gender>男</gender>
<age>25</age>
</Teacher>
<Teacher>
<name>你妹</name>
<gender>男</gender>
<age>40</age>
</Teacher>
</Teachers>
每一个XML文件都有一组唯一根节点,<Teachers></Teachers>,根节点下有若干组子节点<Teacher></Teacher>,每一组子节点又包含了三个自己的子节点(<name></name>,<gender></gender>,<age></age>);
<Teacher>代表的是开始标签,<>草哥<>中间的草哥代表的是标签内容,</Teacher>代表的是结束标签
对于每一对节点来说,如果<>和<>之间有内容,则代表的是这个节点包含的内容;如果<>和<>之间为空,说明这个节点包含的时\n,也就是换行符
XML解析主要有两种方式:SAX解析和DOM解析
SAX解析是利用系统类NSXMLParser进行解析
// 1、 获得文件路径 (第一步和第二部以后会被网络请求取代)
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Teacher" ofType:@"xml"];
// 2、 根据路径获取数据 (NSData)
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3、 创建NSXMLParser对象,进行对data的解析
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
设置代理,记得先遵守协议<NSXMLParserDelegate>
注意SAX解析必须要调用parse方法,否则不会去走代理方法
// 必须调用这个方法,否则不会去走代理方法
[parser parse];
主要用到的方法
- 根据网址接口解析数据
- (instancetype)initWithContentsOfURL:(NSURL *)url;
- 根据本地数据解析
- (instancetype)initWithData:(NSData *)data;
- 开始进行解析
- (BOOL)parse;
应用SAX解析主要用到五种代理方法
1、当开始解析的时候调用的方法(读取到开始根节点时调用的方法)
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@"开始解析!");
self.modelArray = [NSMutableArray array];
}
2、当读取到开始标签时候调用的方法
// 读取到开始标签时候调用的方法
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
NSLog(@"开始标签:%@",elementName);
}
3、当读取到标签内容时调用的方法
// 读取到标签内容时候调用的方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSLog(@"标签内容:%@",string);
// 参数的string有可能是/n,如果为/n,那么下一次调用的肯定是开始标签的方法;如果是真正的内容,那么下一次调用的肯定是结束标签的方法
}
4、当读取到结束标签时调用的方法
// 读取到结束标签时候调用的方法
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSLog(@"结束标签:%@",elementName);
}
5、当读取到结束解析的时候调用的方法
// 结束解析的时候调用的方法
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"结束解析!");
}
DOM解析是利用谷歌提供的GDataXMLNode解析
// 1、 获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"];
// 2、 获取文件中的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3、利用GDataXMLDocument解析数据
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 用&error可以去查看错误信息
// 1.获取所有的信息<Teachers></Teachers>
GDataXMLElement *rootElement = [document rootElement];
// 2、 获取装载所有<Teacher></Teacher>的数组
NSArray *childArray = [rootElement children];
//装载model的数组进行初始化
self.modelArray = [NSMutableArray array];
for (int i = 0; i < childArray.count; i++) {
// model 初始化
Model *model = [[Model alloc] init];
// 每一次对应的<Teacher></Teacher>
GDataXMLElement *oneElement = childArray[i];
// 获取name数组
NSArray *nameArray = [oneElement elementsForName:@"name"];
// 获取name 内容
GDataXMLElement *nameElement = nameArray[0];
// 6、转成字符串
NSString *nameString = [nameElement stringValue];
model.name = nameString;
}
}
JSON解析
首先,我们在model文件中声明与数据源文件中相同的属性名
@property (nonatomic,copy)NSString *address;
@property (nonatomic,copy)NSString *cinemaName;
在model的.h文件中声明一个方法完成对数组的创建以及数据的解析和赋值model属性的过程
// 在此方法内部进行数组的创建以及数据的解析和赋值model属性的过程,然后返回给控制器,控制器中的self.modelArray进行接收这个数组
+ (NSMutableArray *)modelConfigureJson:(NSDictionary *)jsonDic;
在model的.m中实现这个方法
+ (NSMutableArray *)modelConfigureJson:(NSDictionary *)jsonDic {
NSMutableArray *modelArray = [NSMutableArray array];
// 找到result对应的字典
NSDictionary *resultDic = [jsonDic objectForKey:@"result"];
// 找到data key值对应的数组
NSArray *dataArray = [resultDic objectForKey:@"data"];
// 遍历数组,数组中是N个字典,每个字典相当于一个model
for (NSDictionary *dataDic in dataArray) {
Model *model = [[Model alloc] init];
// 相当于字典中的key值对应的value分别赋值给model中与key值对应的属性,如果model中的属性与key值的个数或者名称不对号,那么我们必须在model类中实现setValueForUndeFinedKey这个方法(空实现就行)防止崩溃
// 如果key值对应的value不是一个字符串,我们用字符串接收的时候需要将其转成字符串
[model setValuesForKeysWithDictionary:dataDic];
[modelArray addObject:model];
[model release];
}
return modelArray;
}
在controller类中利用系统类解析JSON数据
- (void)jsonWithSysytem {
// 1、 获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DouBan" ofType:@"json"];
// 2、 获取文件中的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3、 寻找最外层的字典或者数组,如果是字典,就用字典接收,如果是数组,就用数组接收,大部分的最外层都是字典
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
self.modelArray = [Model modelConfigureJson:dic];
}