XML
这种格式的数据是由一个一个的相互嵌套的标签对组成
-
示例
<Teachers> <teacher> <name>张三</name> <gender>男</gender> <age>25</age> </teacher> <teacher> <name>李四</name> <gender>女</gender> <age>23</age> </teacher> </Teachers>
解析
-
相关属性设置
@interface RootViewController ()<NSXMLParserDelegate> @property (nonatomic, retain)NSMutableArray *modelArr; @property (nonatomic, retain)Model *tempModel;//全局model对象来接收数据 @property (nonatomic, copy)NSString *string;// 全局字符串来接收model每个属性的数据 @end
-
利用系统类解析 NSXMLParser (SAX解析)
- (void)xmlWithSystem{ // 1.获取文件路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"]; // [NSBundle mainBundle]返回的是工程文件的主路径 Resource:后面加文件的名 ofType:后面加文件的后缀P.S.没点; // 2.根据路径 获取数据(NSData) NSData *data = [NSData dataWithContentsOfFile:filePath]; // ContentsOfFile:后加文件路径,NSString类型 // 3.创建NSXMLParser 进行对data的解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 4.设置代理 parser.delegate = self;//需要遵守协议NSXMLParserDelegate } //XML解析使用的五个代理方法 //1.当开始解析的时候调用的方法 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"开始解析"); //在这里为model数组开辟空间 self.modelArr = [NSMutableArray array]; } //2.当读取到开始标签的时候调用的方法 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ NSLog(@"开始标签:%@",elementName); if ([elementName isEqualToString:@"Teacher"]) {// 读到Teacher时给model开辟空间,并装载进数组后释放 self.tempModel = [[Model alloc] init]; [_modelArr addObject:_tempModel]; [_tempModel release]; } } //3.当读取到标签内容的时候调用的方法 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ self.string = string; } //4.当读取到结束标签的时候调用的方法 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqual:@"Teacher"] || [elementName isEqual:@"Teachers"]) { return; } [self.tempModel setValue:self.string forKey:elementName]; } //5.当结束解析的时候调用的方法 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"结束解析"); }
-
利用谷歌提供的GDataXMLNode解析 (DOM解析)
利用这种方式解析除了需要GDataXMLNode类的文件之外还需要引入libxml2.tbd框架,然后在Build Settings中搜索Header Search Paths
在Header Search Paths和User Header Search Paths中填入路径$(SDKROOT)/usr/include/libxml2
- (void)xmlWithGDataXMLNode{
// 1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"];
// 2.获取文件中的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3.利用GDataXMLDocument 进行解析数据
NSError *error = nil;
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];//如果出错,error指针会自动吸取错误信息
// 4.获取所有的信息<Teachers></Teachers>
GDataXMLElement *rootElement = [document rootElement];
// 5.获取装载所有<Teacher></Teacher>的数组
NSArray *childArr = [rootElement children];
// 6.找到每个<Teacher></Teacher>以及提前给modelArr开辟空间
self.modelArr = [NSMutableArray array];
for (GDataXMLElement *oneElement in childArr) {
// 7.为model开辟空间,便于下面接收数据
self.tempModel = [[Model alloc] init];
[_modelArr addObject:_tempModel];
[_tempModel release];
// 8.建立属性名的数组,方便下面for循环赋值数据
NSArray *arr = @[@"name",@"gender",@"age"];
for (int i = 0 ; i < 3 ; i++) {
// 9.找到相关属性数组(每个数组里只有一个元素)
NSArray *aArr = [oneElement elementsForName:arr[i]];
// 10.找到内容
GDataXMLElement *aElement = aArr[0];
// 11.赋值属性
[_tempModel setValue:{nameElement stringValue] forKey:arr[i]];
}
}
}
JSON
这种格式一般是由字典和数组嵌套而成,结构多变
-
示例
{ @"result": { "data" : [ { "address": "北京市朝阳区", "cinemaName": "北京博纳影城朝阳门旗舰店", "cityName": "北京", "id": "141" } ] } }
-
利用系统类解析JSON数据
- (void)jsonWithSystem{ //前两部一样获取文件路径和数据 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cinema" ofType:@"json"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; //寻找最外层的字典或数组 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; //找到result key值对应的字典 NSDictionary *resultDic = [dic objectForKey:@"result"]; //找到data key值对应的数组 NSArray *dataArr = [resultDic objectForKey:@"data"]; //modelArr开辟空间 self.modelArr = [NSMutableArray array]; //遍历数组 数组中是N个字典 每个字典相当于一个model for (NSDictionary *dataDic in dataArr) { Model *model = [[Model alloc] init]; [model setValuesForKeysWithDictionary:dataDic];//需要在model类中重写setValue:forUndefinedKey:方法 [_modelArr addObject:model]; [model release]; } }