⼀、解析的基本概念
所谓“解析”:从事先规定好的格式中提取数据
解析的前提:提前约定好格式、数据提供⽅按照格式提供数据、 数据获取⽅则按照格式获取数据
iOS开发常⻅的解析:XML解析、JSON解析
⼆、XML数据结构
XML:Extensible Markup language(可扩展标记语⾔),主流数 据格式之⼀,可以⽤来存储和传输数据。
数据交换
内容管理
⽤作配置⽂件
声明
节点使⽤⼀对标签表⽰。起始和结束标签。
根节点是起始节点,只有⼀个。节点可以嵌套。
节点可以有值。存储在⼀对⼉标签中。
三、JSON数据结构
Javascript Object Notation,轻量级的数据交换格式,采⽤完全 独⽴于语⾔的⽂本格式,被称为理想的数据交换语⾔
JSON⽂档有两种结构:对象、数据
对象:以“{”开始,以“}”结束,是“名称/值”对⼉的集合。名称和值中 间⽤“:”隔开。多个“名称/值”对之间⽤“ , ”隔开。类似OC中的字典。
数组:以“[”开始,以“]”结束,中间是数据。数据以“ , ”分隔。
JSON中的数据类型:字符串、数值、BOOL、对象、数组。
四、XML与JSON两种数据结构的优缺点
//解析xml数据(SAX解析)
-(void)xmlParserUpData
{
//利用系统的NSXMLParser
//xml分析 人 类
//以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)
//真谛:逐行解析
//创建分析人
//获取xml文件路径
NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:[NSData dataWithContentsOfFile:path]];
//驱动事件(设置代理)
parser.delegate = self;
//开始分析
[parser parse];
//释放
[parser release];
}
#pragma mark -- 代理方法
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
//初始化数组保存model
self.arr = [NSMutableArray array];
NSLog(@"已经开始分析文件");
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//遇到student节点初始化model
if ([elementName isEqualToString:@"Student"]) {
self.model = [[Student alloc]init];
}
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//保存字符串
self.str = string;
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"Student"]) {
[self.arr addObject:self.model];
[self.model release];
}else
{
[self.model setValue:self.str forKey:elementName];
}
}
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"已经结束文件分析");
-(void)xmlParserUpData
{
//利用系统的NSXMLParser
//xml分析 人 类
//以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)
//真谛:逐行解析
//创建分析人
//获取xml文件路径
NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:[NSData dataWithContentsOfFile:path]];
//驱动事件(设置代理)
parser.delegate = self;
//开始分析
[parser parse];
//释放
[parser release];
}
#pragma mark -- 代理方法
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
//初始化数组保存model
self.arr = [NSMutableArray array];
NSLog(@"已经开始分析文件");
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//遇到student节点初始化model
if ([elementName isEqualToString:@"Student"]) {
self.model = [[Student alloc]init];
}
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//保存字符串
self.str = string;
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"Student"]) {
[self.arr addObject:self.model];
[self.model release];
}else
{
[self.model setValue:self.str forKey:elementName];
}
}
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"已经结束文件分析");
}
// Dom
解析
依靠第三方类库
GDataXMLNode
// GDataXMLNode 类 依靠系统的 libxml2 来实现
// GDataXMLNode 类 依靠系统的 libxml2 来实现
//
使用的时候
需要导入
libxml2
框架
设置Header Search paths /usr/include/libxml2
//
真谛
:
把所有的节点一次性读取
并转化为
树形结构
整体解析
(
与
SAX
解析对比
)
//-(void)GDataXMLNodeUpData
//{
// NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
// // 创建一个空的错误对象
// NSError *error = nil;
//
//
// // 初始化文件对象
// GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:[NSData dataWithContentsOfFile:path] options:0 error:&error];
//-(void)GDataXMLNodeUpData
//{
// NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
// // 创建一个空的错误对象
// NSError *error = nil;
//
//
// // 初始化文件对象
// GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:[NSData dataWithContentsOfFile:path] options:0 error:&error];
// //
获取根节点
//逐层剥去不能跳步
// GDataXMLElement *rootelement = doc.rootElement;
// // 获取根节点下 student
// NSArray *arr = [rootelement elementsForName:@"Student"];
// self.dataArray = [NSMutableArray array];
// // 遍历数组 对每一个 Student 节点 继续化整为零
// for (GDataXMLElement *element in arr) {
// NSString *name =[self test:element elementname:@"name"];
// NSString *gender = [self test:element elementname:@"gender"];
// NSString *age = [self test:element elementname:@"sex"];
// NSString *motto = [self test:element elementname:@"motto"];
// Student *model = [[Student alloc]init];
// model.name = name;
// model.gender =gender;
// model.age= age;
// model.motto =motto;
// [self.dataArray addObject:model];
// [model release];
// }
//}
// 1. 找爆红的对象 ( 是方法没有的 需要外界传进来 )
// 2. 找可变的对象 ( 例如 name 也是需要传递的 )
// // 获取根节点下 student
// NSArray *arr = [rootelement elementsForName:@"Student"];
// self.dataArray = [NSMutableArray array];
// // 遍历数组 对每一个 Student 节点 继续化整为零
// for (GDataXMLElement *element in arr) {
// NSString *name =[self test:element elementname:@"name"];
// NSString *gender = [self test:element elementname:@"gender"];
// NSString *age = [self test:element elementname:@"sex"];
// NSString *motto = [self test:element elementname:@"motto"];
// Student *model = [[Student alloc]init];
// model.name = name;
// model.gender =gender;
// model.age= age;
// model.motto =motto;
// [self.dataArray addObject:model];
// [model release];
// }
//}
// 1. 找爆红的对象 ( 是方法没有的 需要外界传进来 )
// 2. 找可变的对象 ( 例如 name 也是需要传递的 )
//
选好返回值
/
解析
json
数据
// 真谛 : 必须要指定 json 文件的最外层是什么
// 真谛 : 必须要指定 json 文件的最外层是什么
// []
数组
{}
字典
//JSONKIT 解析数据
NSString *path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
//jsonKit 解析
NSMutableArray *arr = [data objectFromJSONData];
NSString *path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
//jsonKit 解析
NSMutableArray *arr = [data objectFromJSONData];
self.arr = [NSMutableArray array];
//json 解析
// NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutableContainers error:nil];
for (NSDictionary *one in arr) {
City *model = [[City alloc]init];
[model setValuesForKeysWithDictionary:one];
[self.arr addObject:model];
[model release];
}
City *model = [[City alloc]init];
[model setValuesForKeysWithDictionary:one];
[self.arr addObject:model];
[model release];
}
五、进⾏XML数据结构解析时使⽤到的SAX⼯具,DOM⼯具
SAX:Simple API for XML。基于事件驱动的解析⽅式,逐⾏解析 数据。(采⽤协议回调机制)
NSXMLParser是iOS⾃带的XML解析类。采⽤SAX⽅式解析数据。
解析过程由NSXMLParserDelegate协议⽅法回调
解析过程:开始标签->取值->结束标签->取值
DOM:Document Object Model(⽂档对象模型)。解析时需要 将XML⽂件整体读⼊,并且将XML结构化成树状,使⽤时再通过树 状结构读取相关数据
GDataXMLNode是Google提供的开源XML解析类,对 libxml2.dylib进⾏了Objective-C的封装
采⽤DOM⽅式解析数据
iOS中包含⼀个C语⾔的动态链接库libxml2.dylib,解析速度⽐ NSXMLParser快
六、进⾏JSON数据结构解析时使⽤到的第三⽅框架
NSJSONSerialization对象的作⽤
JSONDecoder对象的作⽤
NSString(JSONKitDeserializing)类⺫的作⽤
NSData(JSONKitDeserializing)类⺫的作⽤
NSString(JSONKitSerializing)类⺫的作⽤
NSArray(JSONKitSerializing)类⺫的作⽤
NSDictionary(JSONKitSerializing)类⺫的作⽤
总结
数据解析:从某种格式的数据中提取⾃⼰所需要的数据。
主流的数据交换格式有两种:XML和JSON
XML解析分为两种:SAX解析和DOM解析 XML解析⼯具:NSXMLParser、GDataXMLNode、TochXML和KissXML等
JSON解析⼯具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON 等,其中NSJSONSerialization是系统提供的解析类,其解析效率是最⾼的