解析: 就是以约定好的格式,后台开发人员将数据进行存储,前台人员进行按照对应格式进行数据获取的过程. 数据格式是由后台人员决定,我们无权干涉.
当今流行的数据格式XML和JSON
对于我们来说数据解析就是根据XML 或者JSON的格式进行数据读取.
XML解析方式主要有两种 一个是SAX解析 一个是DOM解析.
代码中设置的属性
@property (nonatomic,copy)NSString *contentStr; //记录读取内容
@property (nonatomic,retain)NSMutableDictionary *categortyDic;//分类
@property (nonatomic,retain)NSMutableArray *categortArr; //分类数组
1:SAX解析是系统提供的 是根据协议代理回调的方式进行数据获取,他在数据解析时候,是将数据一条一条的进行读取解析,适合大型数据 遵守 协议
- (IBAction)SAXParser:(id)sender {
//创建字典 只有一个字典
self.categortyDic = [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];
//遍历字典
for (NSString *key in _categortyDic) {
//获取对应分组
NSMutableArray *group = [_categortyDic valueForKey:key];
NSLog(@"------------%@--------------",key);
//b遍历分组
for (NSString *str in group) {
NSLog(@"%@",str);
}
}
}
pragma mark – SAX解析 NSXMLParserDelegate
//读取到开始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"category_name"]) {
//创建对应分组
self.categortArr = [NSMutableArray array];
}
}
//获取内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//记录读取内容
self.contentStr = string;
}
//读取到结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"category_name"]) {
//将对应分组放入 字典中 读取的内容 例如:美食 作为key
[_categortyDic setValue:_categortArr forKey:_contentStr];
}else if ([elementName isEqualToString:@"subcategories"])
{
//就把内容放到数组里面 例如 : 四川菜
[_categortArr addObject:_contentStr];
}
}
2: DOM 解析 一般我们使用由谷歌提供的第三方GDataXMLNode进行解析 对于DOM解析,会将数据整个读入内存,形成一个树形结构,我们通过树形结构的层级进行数据的获取, 适合小型数据.
对应GDataXMLNode 是在C语言动态链接基础上进行OC语言的XML解析工具.
在使用时候我们需要进行三部配置:
(1):导入动态链接库 libxml2.2.dylib
(2):在 Header Search Path 中配置 /usr/include/libxml2
(3):在other Linker 中配置 -lxml2
- (IBAction)DOMParser:(id)sender {
//创建字典 承装解析后的数据
self.categortyDic = [NSMutableDictionary dictionary];
//1: 获取文件路径
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Categories(1)" ofType:@"xml"];
//2: 读取文件内容
NSString *patrserStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//3: 将需要解析的内容读入 document
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithXMLString:patrserStr options:0 error:nil];
//获取根节点
GDataXMLElement *rootElement = [xmlDocument rootElement];
//5: 获取子节点们
// NSArray *elements = [rootElement elementsForName:@"status"];
// GDataXMLElement *status = [elements firstObject];
// NSString *statusValue = [status stringValue];
// NSLog(@"%@",statusValue); //获取OK
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];
//将分组放入字典
[_categortyDic setValue:group forKey:categoryName];
//遍历子节点们
for (GDataXMLElement *element in subcategories) {
//获取叶子节点的值
NSString *subStr = [element stringValue];
NSLog(@"%@",subStr);
//将值放入对应的分组
[group addObject:subStr];
}
NSLog(@"%@",group);
}
}