Parse终极总结
2016-01-11 21:33
731 查看
解析:从实现规定好的格式中提取数据.
解析的前提:提前约定好格式,数据提供按照格式提供好数据,数据接收方按照格式获取数据,这就是前提
两种格式:XML格式, Json格式
解析XML格式:NSXMLParser, GData
解析Json格式:JsonSerialization, JsonKit
1 XML
Extensible Markup Language (可扩展的标记语言), 主流数据之一,可用来存储和传输数据
例如:Message.txt
XML的作用: 配置文件, 内容管理, 数据交换
XML的解析方式有两种:1.1 SAX解析, 1. 2 DOM解析
1.1 SAX解析:
simple API for XML
基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)
点击解析button方法中:
#pragma mark --- SAX解析
- (void)SexXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象,绑定数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2 指定代理
parser.delegate = self;
// 3 开始解析
[parser parse];
}
在button方法外直线代理的方法:
// 4 实现代理的方法
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// NSLog(@"开始解析文档");
self.data = [NSMutableArray array];
}
1. 2 使用DOM方式解析XML:
DOM -> document object model (文档对象模型)
解析的时候 将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取.
dom解析方式比较好的一个实现是Google提供的GData,是开源的,他是对libxml.dylib的封装,也就是说需要导入类库
<span style="font-size:14px;">#pragma mark --- 使用DOM方式解析XML
- (void)DomXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象 绑定数据源data
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // doc 代表整个XML文档
// 2 拿到根节点
GDataXMLElement *root = doc.rootElement;
// 拿到子节点
NSArray *modelArray = root.children;
// 初始化data数组
self.data = [NSMutableArray array];
// 遍历数组取到每一个model对应的节点
for (GDataXMLElement *modelEle in modelArray) {
Person *p = [[Person alloc] init];
// 获得属性节点数组
NSArray *proArray = modelEle.children;
for (GDataXMLElement *proEle in proArray) {
[p setValue:proEle.stringValue forKey:proEle.name];
}
[self.data addObject:p];
}
// 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}</span>
2. Json格式数据:
javascript object notation 轻量级数据交换格式,被称为理想的数据交换语言
在Json中只有两种东西: 对象,数据
例如:Json.txt
2. 1 解析Json格式数据有两种方式:
JsonKit (第三方)
#pragma mark --- 使用JSONKit进行解析
- (void)JSONKitAction {
// 模拟从网络上获取数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 1 直接从data中拿对象
NSArray *array = [data objectFromJSONData]; // 这个数组是一个成员变量为字典的数组
// 2 初始化数组
self.data = [NSMutableArray array];
// 3 遍历数组
for (NSDictionary *dic in array) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
// 4 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}
2. 2 使用系统提供的类NSJSONSerialization进行JSON解析
<span style="font-size:14px;">#pragma mark --- 使用系统提供的类进行JSON解析
- (void)JSONSerializationAction {
// 模拟数据的获取
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
self.data = [NSMutableArray array];
for (NSDictionary *dic in arr) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}</span>
上面所用的模Person
Person.h中
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *info;
@end
Person.m中
由于在解析时往self.data中添加时用到了<span style="font-size:14px;">p setValuesForKeysWithDictionary:dic,所以为了安全在Person.m中不要忘记这句话</span>
#import "Person.h"
@implementation Person
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
@end
解析的前提:提前约定好格式,数据提供按照格式提供好数据,数据接收方按照格式获取数据,这就是前提
两种格式:XML格式, Json格式
解析XML格式:NSXMLParser, GData
解析Json格式:JsonSerialization, JsonKit
1 XML
Extensible Markup Language (可扩展的标记语言), 主流数据之一,可用来存储和传输数据
例如:Message.txt
XML的作用: 配置文件, 内容管理, 数据交换
XML的解析方式有两种:1.1 SAX解析, 1. 2 DOM解析
1.1 SAX解析:
simple API for XML
基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)
点击解析button方法中:
#pragma mark --- SAX解析
- (void)SexXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象,绑定数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2 指定代理
parser.delegate = self;
// 3 开始解析
[parser parse];
}
在button方法外直线代理的方法:
// 4 实现代理的方法
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// NSLog(@"开始解析文档");
self.data = [NSMutableArray array];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { // NSLog(@"开始解析标签"); if ([elementName isEqualToString:@"person"]) { Person *p = [[Person alloc] init]; [self.data addObject:p]; } self.currentElement = elementName; self.tempString = [NSMutableString string]; }
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // NSLog(@"解析中间数据项"); [self.tempString appendString:string]; } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { Person *p = [self.data lastObject]; // 利用KVC进行属性赋值 [p setValue:self.tempString forKey:self.currentElement]; // NSLog(@"结束解析标签"); self.currentElement = nil; self.tempString = nil; }
- (void)parserDidEndDocument:(NSXMLParser *)parser { // NSLog(@"结束解析文档"); for (Person *p in self.data) { NSLog(@"%@--%@--%@", p.name, p.sex, p.info); } } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"OMG,文档有毒!!!"); }
1. 2 使用DOM方式解析XML:
DOM -> document object model (文档对象模型)
解析的时候 将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取.
dom解析方式比较好的一个实现是Google提供的GData,是开源的,他是对libxml.dylib的封装,也就是说需要导入类库
<span style="font-size:14px;">#pragma mark --- 使用DOM方式解析XML
- (void)DomXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象 绑定数据源data
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // doc 代表整个XML文档
// 2 拿到根节点
GDataXMLElement *root = doc.rootElement;
// 拿到子节点
NSArray *modelArray = root.children;
// 初始化data数组
self.data = [NSMutableArray array];
// 遍历数组取到每一个model对应的节点
for (GDataXMLElement *modelEle in modelArray) {
Person *p = [[Person alloc] init];
// 获得属性节点数组
NSArray *proArray = modelEle.children;
for (GDataXMLElement *proEle in proArray) {
[p setValue:proEle.stringValue forKey:proEle.name];
}
[self.data addObject:p];
}
// 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}</span>
2. Json格式数据:
javascript object notation 轻量级数据交换格式,被称为理想的数据交换语言
在Json中只有两种东西: 对象,数据
例如:Json.txt
2. 1 解析Json格式数据有两种方式:
JsonKit (第三方)
#pragma mark --- 使用JSONKit进行解析
- (void)JSONKitAction {
// 模拟从网络上获取数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 1 直接从data中拿对象
NSArray *array = [data objectFromJSONData]; // 这个数组是一个成员变量为字典的数组
// 2 初始化数组
self.data = [NSMutableArray array];
// 3 遍历数组
for (NSDictionary *dic in array) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
// 4 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}
2. 2 使用系统提供的类NSJSONSerialization进行JSON解析
<span style="font-size:14px;">#pragma mark --- 使用系统提供的类进行JSON解析
- (void)JSONSerializationAction {
// 模拟数据的获取
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
self.data = [NSMutableArray array];
for (NSDictionary *dic in arr) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}</span>
上面所用的模Person
Person.h中
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *info;
@end
Person.m中
由于在解析时往self.data中添加时用到了<span style="font-size:14px;">p setValuesForKeysWithDictionary:dic,所以为了安全在Person.m中不要忘记这句话</span>
#import "Person.h"
@implementation Person
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
@end
相关文章推荐
- XML 与 JSON 优劣对比
- VBA将excel数据表生成JSON文件
- newtonsoft.json解析天气数据出错解决方法
- vbs 解析json jsonp的方法
- Extjs4如何处理后台json数据中日期和时间
- C#实现将类的内容写成JSON格式字符串的方法
- JQuery ajax返回JSON时的处理方式 (三种方式)
- jquery JSON的解析方式示例介绍
- c#版json数据解析示例分享
- ASP JSON类文件的使用方法
- C#实现对Json字符串处理实例
- C#实现Json转Unicode的方法
- php解析json数据实例
- PHP中JSON的应用技巧
- PHP6 先修班 JSON实例代码
- 关于JSON以及JSON在PHP中的应用技巧
- .Net中的json操作类用法分析
- C#操作 JSON方法汇总
- JavaScript中字符串(string)转json的2种方法
- js Object2String方便查看js对象内容