UI进阶:数据解析(XML解析和JSON解析)
来源:互联网 发布:三维b超单数据怎么看 编辑:程序博客网 时间:2024/05/19 00:44
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];}
0 0
- UI进阶:数据解析(XML解析和JSON解析)
- UI进阶——XML解析与Json解析
- XML 和 JSON 解析数据
- XML和JSON数据解析
- Json和Xml数据解析
- IOS--UI--LessonParse 数据解析 XML JSON
- UI---JSON数据解析
- 数据解析(XML、JSON)
- JSON解析和XML解析
- JSON解析和XML解析
- XML、JSON数据解析
- 数据解析XML,JSON
- 数据解析-----Json-----XML
- JSON、XML数据解析
- 数据解析JSON/XML
- UI XML,JSON 数据结构解析
- Android解析XML数据和Json数据
- xml和json解析
- React Native之ViewPagerAndroid仿淘宝首页顶部分类布局效果实现
- SQL事务
- 借助 ptpython 三个命令实现终端下 PySpark 代码高亮和代码补全:
- Codeforces Round #346 (Div. 2) F bfs+并查集
- Hdu oj 1596 find the safest road(floyd)
- UI进阶:数据解析(XML解析和JSON解析)
- 2016.3.31Python函数的参数
- Aireplay-ng 的 6 种攻击模式详解
- C++中的C_str()函数用法
- Java中接口是否可以包含变量
- 浅谈Sqlsession和数据库的连接池
- 笔试题10. 在线笔试
- iOS快速定位问题
- CodeForces 377B-Preparing for the Contest(二分+贪心)