您的位置:首页 > 理论基础 > 数据结构算法

UI第十五天:XML、JSON数据结构解析

2015-12-02 20:07 387 查看
⼀、解析的基本概念
所谓“解析”:从事先规定好的格式中提取数据
解析的前提:提前约定好格式、数据提供⽅按照格式提供数据、 数据获取⽅则按照格式获取数据
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(@"已经结束文件分析");
}

// Dom解析
依靠第三方类库GDataXMLNode

// 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];
// //
获取根节点
//逐层剥去不能跳步

// 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
也是需要传递的)
//选好返回值

/
解析json数据

//
真谛:必须要指定json文件的最外层是什么
// []数组 {}字典
//JSONKIT
解析数据

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];

}

五、进⾏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是系统提供的解析类,其解析效率是最⾼的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: