解析:以约定好的方式,后台开发人员将数据进行存储,前端人员按照对应格式进行数据获取的过程.
数据格式是由后台人员决定,我们无权干涉
当今流行的数据格式:XML和JSON
对于我们来说,数据解析就是根据XML 或者JSON的格式进行数据的读取
XML解析方式主要有两种: SAX解析 和 DOM解析
SAX解析式系统提供的,是根据协议代理回调的方式进行数据的获取 .它在数据解析式,是将数据一条一条的进行读取解析, 适合大型数据.
//创建字典
self.categoryDic = [NSMutableDictionary dictionary];
//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"xml"];
//2.读取文件内容
NSData *parserData = [NSData dataWithContentsOfFile:filePath];
//3.创建解析对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData];
//4.设置代理
parser.delegate = self;
//5.解析
[parser parse];
代理方法
#pragma mark - SAX解析 NSXMLParserDelegate
//读取到开始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@",elementName);
if ([elementName isEqualToString:@"category_name"]) {
//创建对应分组
self.categoryArr = [NSMutableArray array];
}
}
//获取内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%@",string);
//记录读取的内容
self.contentStr = string;
}
//读取到结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"%@",elementName);
if ([elementName isEqualToString:@"category_name"]) {
//将对应分组 放入字典中 读取的内容 例如 美食 作为 key
[_categoryDic setValue:_categoryArr forKey:_contentStr];
}else if([elementName isEqualToString:@"subcategories"])
{
//就将读取的内容 放入数组 例如 四川菜
[_categoryArr addObject:_contentStr];
}
}
DOM解析:一般我们使用由Google提供的第三方GDataXMLNode进行解析 对于DOM解析,会将数据整个读入内存性能构成一个数树形结构
* 我们通过树形结构的层级 进行数据的获取 适合小型数据
* 对于GDataXMLNode 是在C语言动态链接库基础上进行OC语言的XML解析工具 在使用时 我们需要进行三步配置
* 1.导入动态链接库 libxml2.2.lib
* 2.在Header Search Paths中配置 /usr/include/libxml2
* 3.在Other Linker 中配置 -lxml2
//创建字典 承装解析后的数据
self.categoryDic = [NSMutableDictionary dictionary];
//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"xml"];
//2.读取文件内容
NSString *parseStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//3.将需要解析的内容 读入 document
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:parseStr options:0 error:nil];
//4.获取根节点
GDataXMLElement *rootElement = [document rootElement];
//5.获取子节点们
// NSArray *elements = [rootElement elementsForName:@"status"];
// GDataXMLElement *status = [elements firstObject];
// NSString *statusValue = [status stringValue];
// NSLog(@"%@",statusValue);
NSArray *elements = [rootElement elementsForName:@"categories"];
//遍历每一个子节点
for (GDataXMLElement *element in elements) {
//获取下一级的子节点们
NSArray *names = [element elementsForName:@"category_name"];
NSArray *subcategories = [element elementsForName:@"subcategories"];
//获取 叶子节点的值
NSString *categoryName = [[names firstObject] stringValue];
NSLog(@"--------%@---------",categoryName);
//创建对应分组
NSMutableArray *group = [NSMutableArray array];
[_categoryDic setValue:group forKey:categoryName];
//遍历 子节点们
for (GDataXMLElement *element in subcategories) {
//获取 叶子节点的值
NSString *subStr = [element stringValue];
NSLog(@"%@",subStr);
//将值放入对应分组
[group addObject:subStr];
}
}
NSLog(@"%@",_categoryDic);
对于JSON数据解析 我们有很多第三方工具 我们一般使用JSONKit 他是通过给NSString,NSData添加分类的方式 进行解析,在效率上仅次于系统提供的JSON解析
JSONKit类解析:
//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
//2.读取文件内容
NSData *parserData = [NSData dataWithContentsOfFile:filePath];
//3.解析
NSArray *arr = [parserData objectFromJSONData];
系统提供的
JSON解析
//获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"大众点评数据" ofType:@"json"];
//获取文件内容
NSData *data = [NSData dataWithContentsOfFile:filePath];
//解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];