
本文共 9391 字,大约阅读时间需要 31 分钟。
补充:ARC和MRC是编译器的机制
使用ARC:-fno-objc-arc:
忽略ARC:-fobjc-arc
数据解析:
1. XML:
1.1 SAX:
第一步:获取存放xml数据的文件路径(NSBundle)
第二步:以NSData的形式获得数据
第三步:NSXMLParser 声明变量 初始化 利用data
第四步:遵守协议:<NSXMLParserDelegate> 设置代理
第五步:开启数据解析(必须写这一步)
// 按钮的点击事件- (IBAction)buttonXML_SAX:(id)sender { // 第一步:获取存放xml数据的文件路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"]; // 第二步:以NSData的形式拿到数据 NSData *data = [NSData dataWithContentsOfFile:filePath]; // 第三步:用系统提供的类 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 第四步:设置代理,需要先遵守协议:parser.delegate = self; // 第五步:开启数据解析 必须调用这个方法 数据解析的时候需要用代理方法解析 [parser parse];}
开始解析:-(void)parserDidStartDocument:(NSXMLParser *)parser
结束解析:-(void)parserDidEndDocument:(NSXMLParser *)parser
找开始节点:-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict找结束节点:-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
寻找相应数据:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
1. 无法打印数据:
@interface ViewController (){ StudentModel *model; NSMutableDictionary *dic; NSString *key;}@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.}- (IBAction)buttonXML_SAX:(id)sender { NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; [parser parse];}-(void)parserDidStartDocument:(NSXMLParser *)parser { // 开始解析 self.arraySAX = [[NSMutableArray alloc] init];}-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary打印结果:(空格和回车将李晓...替换了)*)attributeDict { // 节点开始 if ([elementName isEqualToString:@"student"]) { dic = [[NSMutableDictionary alloc] init]; model = [[StudentModel alloc] init]; } // 将elementName保存下来 后续的字典赋值会需要 key = elementName; }-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 找到相应节点的数据 [dic setObject:string forKey:key];}-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 节点结束: if ([elementName isEqualToString:@"student"]) { [model setValuesForKeysWithDictionary:dic]; [self.arraySAX addObject:model]; }}-(void)parserDidEndDocument:(NSXMLParser *)parser { //结束解析 for (StudentModel *m in self.arraySAX) { NSLog(@"%@",m); } }
2015-11-02 19:14:28.875 test-数据解析[5224:430839] ( "\n , \n ,\n ", "\n , \n ,\n ", "\n , \n ,\n ", "\n , \n ,\n ")2. 修改一:
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 找到相应节点的数据 if ([string rangeOfString:@"\n"].location == NSNotFound) { [dic setObject:string forKey:key]; }}结果打印:
2015-11-02 19:24:19.746 test-数据解析[5299:439181] 李晓, 男 ,202015-11-02 19:24:19.747 test-数据解析[5299:439181] 李青海, 男 ,222015-11-02 19:24:19.748 test-数据解析[5299:439181] 周群, 男 ,252015-11-02 19:24:19.748 test-数据解析[5299:439181] 张三丰, 女 ,1083. 修改二:
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 找到相应节点的数据 进行赋值 以便后续使用 currentString = string;}-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 节点结束: // 强调:这里不能写成:[dic setObject:currentString forKey:key] 不然最后的那个值会为空(这个题里是age) // 可以打印测试一下:NSLog(@"key == %@, elementName == %@",key , elementName); [dic setObject:currentString forKey:elementName]; if ([elementName isEqualToString:@"student"]) { [model setValuesForKeysWithDictionary:dic]; [self.arraySAX addObject:model]; }}结果打印:
2015-11-02 19:50:27.904 test-数据解析[5450:456826] 李晓, 男 ,202015-11-02 19:50:27.904 test-数据解析[5450:456826] 李青海, 男 ,222015-11-02 19:50:27.904 test-数据解析[5450:456826] 周群, 男 ,252015-11-02 19:50:27.905 test-数据解析[5450:456826] 张三丰, 女 ,1084. 修改三:
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 节点结束: // 根据model的属性 直接给model赋值, 不需要字典啦(前面的方法可以直接把字典去掉啦) if ([elementName isEqualToString:@"name"]) { model.name = currentString; }else if ([elementName isEqualToString:@"gender"]) { model.gender = currentString; }else if ([elementName isEqualToString:@"age"]) { model.age = currentString; }else if ([elementName isEqualToString:@"student"]) { [self.arraySAX addObject:model]; }}
结果打印:
2015-11-02 20:06:04.511 test-数据解析[5504:467470] 李晓, 男 ,202015-11-02 20:06:04.512 test-数据解析[5504:467470] 李青海, 男 ,222015-11-02 20:06:04.513 test-数据解析[5504:467470] 周群, 男 ,252015-11-02 20:06:04.513 test-数据解析[5504:467470] 张三丰, 女 ,108
1.2 DOM:
先导入:GDataXMLNode文件 ------- target Header Search Paths:/usr/include/libxml2 --------Other Linker Flags:导入:libxml2
C语言的动态链接库:libxml2.dylib
GDataXMLNode是Google提供的开源XML解析类,对libxml2.dylib进⾏了Objective-C的封装
设置忽略ARC(前面有设置的方法)
树状结构:
第一步:获取存数据文件的路径
第二步:通过NSData获取数据
第三步:声明GDataXMLDocument类型变量 用data
第四步:获取根节点----根据某个节点寻找里面的数据
第五步:遍历:获取各个值 -------赋给model -------赋给数组存储
- (IBAction)buttonXML_DOM:(id)sender { // 初始化数组属性 用来存储最终的结果 self.dataArrayDOM =[[NSMutableArray alloc] init]; // 第一步:获取文件的路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"]; // 第二步:data获取数据 NSData *data = [NSData dataWithContentsOfFile:filePath]; // 第三步:声明GDataXMLDocument变量 GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 取得上述文件的根节点 GDataXMLElement *element = [document rootElement]; // 根据student节点找里面的数据 NSArray *array = [element elementsForName:@"student"]; for (GDataXMLElement *elem in array) { // 获取名字 GDataXMLElement *el1 = [[elem elementsForName:@"name"] lastObject]; NSString *strName = [el1 stringValue]; // 获取性别 GDataXMLElement *el2 = [[elem elementsForName:@"gender"] lastObject]; NSString *strGender = [el2 stringValue]; // 获取年龄 GDataXMLElement *el3 = [[elem elementsForName:@"age"] lastObject]; NSString *strAge = [el3 stringValue]; // 将获取的值给字典 NSDictionary *dicDOM = @{@"name":strName, @"gender":strGender, @"age":strAge}; StudentModel *modelDOM = [[StudentModel alloc] init]; // KVC [modelDOM setValuesForKeysWithDictionary:dicDOM]; [self.dataArrayDOM addObject:modelDOM]; } // 遍历打印: for (StudentModel *model1 in self.dataArrayDOM) { NSLog( @"%@",model1); }}结果打印:
2015-11-02 21:09:43.830 test-数据解析[5912:509486] 李晓, 男 ,202015-11-02 21:09:43.831 test-数据解析[5912:509486] 李青海, 男 ,222015-11-02 21:09:43.831 test-数据解析[5912:509486] 周群, 男 ,252015-11-02 21:09:43.832 test-数据解析[5912:509486] 张三丰, 女 ,108
两种形式都需要重写父类方法:
-(NSString *)description { return [NSString stringWithFormat:@"%@, %@ ,%@", self.name, self.gender, self.age];}
2. JSON:
文件格式:[{"name":"李晓","gender":"男","age":"23"},{"name":"李青海","gender":"男","age":"20"},{"name":"李青楠","gender":"男","age":"25"}]
2.1 Foundation:
#pragma mark *********** 1. JSON解析的第一种形式:Foundation ***********- (IBAction)buttonJSON:(id)sender { // 1. 从bundle中取数据 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; //2. json解析: (将data中的数据转换成数组) NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; // 3. 把拿到的数据中的字典转换成model类型(遍历) // 初始化属性 (数组) self.dataArray = [[NSMutableArray alloc] init]; for (NSDictionary *dic in array) { StudentModel *model = [[StudentModel alloc] init]; [model setValuesForKeysWithDictionary:dic]; [self.dataArray addObject:model]; } for (StudentModel *m in self.dataArray) { NSLog( @"%@, %@, %@",m.name, m.gender, m.age); }}
结果打印:
2015-11-02 22:00:32.516 UI-Lesson15-JSON[6366:544230] 李晓 男 232015-11-02 22:00:32.518 UI-Lesson15-JSON[6366:544230] 李青海 男 202015-11-02 22:00:32.518 UI-Lesson15-JSON[6366:544230] 李青楠 男 25
2.2 JSONKit:
#pragma mark *********** 2. JSON解析的第一种形式:JSONKit ***********- (IBAction)jsonKit:(id)sender { // 1. 从相应路径中获取数据 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; // 2. 将一堆数据转换成数组 NSArray *array = [data objectFromJSONData]; // 3. 遍历 将数组中的字典元素转换为model 再赋给数组属性 self.dataArray1 = [[NSMutableArray alloc] init]; for (NSDictionary *dic in array) { StudentModel *model = [[StudentModel alloc] init]; [model setValuesForKeysWithDictionary:dic]; [self.dataArray1 addObject:model]; } for (StudentModel *mo in self.dataArray1) { NSLog(@"%@ %@ %@", mo.name, mo.gender, mo.age); } }结果打印和上述一样。
转载地址:https://blog.csdn.net/Evelynzn/article/details/49584173 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关于作者
