数据解析(SAX, JSON)
为了方便客户端和服务端进行数据的传递, 会对数据的格式进行限定, 主流的数据格式:
XML: Extensible Marup Language, 可扩展标记语言
XML数据的特点
1.有一个根节点
2.每一个节点, 都有一个父节点和多个子节点
3.如果一个节点没有父节点, 叫根节点
4.如果一个节点没有子节点, 叫叶节点
5.每一个节点都由一个开始标签<>和一个结束标签</>
6.数据存放在开始标签和结束标签之间
解析: 从数据中提取有用的信息的过程
XML的解析方式:
1.SAX: 逐行解析(读一行, 解析一行), 效率比较低, 遇到错误时, 错误之前的数据都能解析
2.DOM: 整篇解析(整篇内容读完, 再解析), 效率比较高, 遇到错误, 无法解析
JSON: Javascript Object Natation, 最理想的数据格式
JSON数据的特点
1.由数组和字典组成
2.数组用[]表示
3.字典用{}表示
4.数组中的元素, 用逗号隔开
5.字典中的键值对用逗号隔开
6.字符串要加双引号
JSON的解析途径
1.apple
2.第三方
SAX解析
解析文件
Student.xml <Students> <student> <name>蹦蹦</name> <age>24</age> <gender>男</gender> </student> <student> <name>张三</name> <age>18</age> <gender>女</gender> </student> <student> <name>李四</name> <age>20</age> <gender>男</gender> </student> </Students>
- (IBAction)sax:(UIButton *)sender { NSXMLParser, XML解析类, sax方式, 继承于NSObject //文件的路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"]; //NSURL, 统一资源定位符 NSURL *url = [NSURL fileURLWithPath:path]; //创建解析类 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; //设置代理, 解析的过程在delegate方法中实现 parser.delegate = self; //开始解析 [parser parse]; //释放 [parser release]; }
遵守协议
#pragma mark - NSXMLParserDelegate - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"文档已经开始解析"); self.studentArray = [NSMutableArray arrayWithCapacity:3]; } - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"文档已经结束解析"); NSLog(@"%@", self.studentArray); } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"遇到开始标签%@", elementName); if ([elementName isEqualToString:@"student"]) { student = [[Student alloc] init]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"遇到结束标签%@", elementName); if ([elementName isEqualToString:@"name"]) { student.name = _content; } else if ([elementName isEqualToString:@"age"]) { student.age = _content; } else if([elementName isEqualToString:@"gender"] ){ student.gender = _content; } else if([elementName isEqualToString:@"student"]){ [self.studentArray addObject:student]; NSLog(@"%@", student); [student release]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"遇到内容%@", string); self.content = string; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"解析出现错误%@", parseError); } @end
DOM解析类: GDataXMLNode, google提供的DOM解析类 第三方: 除去你和苹果官方的其他代码: Third Part, Vender
第三方的获取途径
http://www.code4app.com
http://cocoaChina.com
https://github.com
第三方使用的步骤
1.导入工程
2.配置环境(optional)
a.导入框架
根据头文件里给的信息修改配置环境
b.配置工程参数
双击右边添加参数
3.引入头文件
- (IBAction)dom:(UIButton *)sender {获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
根据文件路径, 找到文件, 读取文件内容
//注: 默认MaxOS下地文字编码格式是UTF-8
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", content);
GDataXMLDocument: 用于读取文档
NSError *error = nil;
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:&error];
内容读完以后, 可以分析出整个XML数据的结构
//找根节点
GDataXMLElement *rootElement = [document rootElement];
//通过节点名, 找子节点
NSArray *elements = [rootElement elementsForName:@"student"];
self.studentArray = [NSMutableArray arrayWithCapacity:3];
//遍历节点数组
for (GDataXMLElement *ele in elements) {
//创建学生对象
Student *stu = [[Student alloc] init];
//赋值
stu.name = [[[ele elementsForName:@"name"] firstObject] stringValue];
stu.age = [[[ele elementsForName:@"age"] firstObject] stringValue];
stu.gender = [[[ele elementsForName:@"gender"] firstObject] stringValue];
//添加到数组中
[self.studentArray addObject:stu];
//释放
[stu release];
}
NSLog(@"%@", self.studentArray);
XPath: 路径检索
GDataXMLNode是支持XPath的
// /: 绝对路径 @"student/name" //: 相对路径 @"//name"
NSArray *names = [rootElement nodesForXPath:@"//name" error:nil];
for (GDataXMLElement *ele in names) {
NSLog(@"%@", [ele stringValue]);
}
}
JSON方法
解析文件
Student.json
[
{
"name": "强强",
"age": "18",
"gender": "男"
},
{
"name": "蹦蹦",
"age": "28",
"gender": "男"
},
{
"name": "忠忠",
"age": "38",
"gender": "男"
}
]
apple方法
- (IBAction)apple:(UIButton *)sender {
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
NSData, 二进制数据, 继承于NSObject
NSData *data = [NSData dataWithContentsOfFile:path];
NSJSONSerialization, JSON解析类(序列化), 继承于NSObject
参数1: 二进制数据
参数2: options: NSJSONReadingOptions:
NSJSONReadingMutableContainers, 生成的数组和字典是可变的
NSJSONReadingMutableLeaves, 生成的字符串是可变的
NSJSONReadingAllowFragments, 允许最外层不是数组或字典
NSError *error = nil;
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"%@", array);
}
//数据的封装
self.studentArray = [NSMutableArray arrayWithCapacity:3];
for (NSMutableDictionary *dic in array) {
//1
// Student *stu = [[Student alloc] init];
// stu.name = dic[@"name"];
// stu.age = dic[@"age"];
// stu.gender = dic[@"gender"];
2.KVC
Student *stu = [[Student alloc] init];
[stu setValuesForKeysWithDictionary:dic];
NSLog(@"%@", stu);
[self.studentArray addObject:stu];
[stu release];
}
NSLog(@"%@", _studentArray);
}
JSON第三方方法
添加文件, 引入头文件
- (IBAction)vendor:(UIButton *)sender { //获取文件路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"]; //获取二进制数据 NSData *data = [NSData dataWithContentsOfFile:path]; NSArray *array = [data objectFromJSONData]; NSLog(@"%@", array); }
原文:http://www.cnblogs.com/OrangesChen/p/4951201.html