您的位置:首页 > 移动开发 > IOS开发

ios 数据解析(XML,JSON)

2016-05-11 12:32 537 查看

1.何为解析

解析:按照一种约定好的格式(假象), 有后台开发人员, 按照格式存数据, 由前端按照格式取数据(谨记: 这种格式是由后台开发人员决定的, 我们无权决定)

解析的本质: 按照约定好的格式取出我们想要数据的过程,所谓“解析”就是从事先规定好的格式串中提取数据

解析的前提:提前约定好格式、数据提供方按照格式提供数据、数据获取方按照格式获取数据

2. 当今比较流行的格式

1.XML格式

Extensible Markup language (可扩展标记语言),主流格式之一,可以用来存储和传输数据格式之一,可以用来存储和传输数据。

2.JSON格式

Javascript Object Notation ,轻量级的数据交换格式,采用完全独立于语言的文本格式,被称为理想的数据交换语言,易于人阅读和便携,同时也易于及其解析何程,由于JSON解析便捷、快速,并且相同数据用JSON编辑所占的内存更小,所以在iOS中我们我们使用JSON解析更加普遍。

XML解析

1.SAX解析

SAX解析:基于事件回调的解析机制, 就是使用协议以及代理. SAX解析是逐行解析, 读入数据时只读入一行, 一行一行的解析, 所以SAX解析占用内存较小, 适合于大数据解析。

主要用到的是解析器对象:NSXMLParser,利用代理方法把数据解析出来。

//1.创获取文件路径
NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
//2.创建解析器对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:pathStr]];
//3.设置代理
parser.delegate = self;
//4.开始解析
[parser parse];


NSXMLParserDelegate代理方法中的处理


/**
*  开始解析MXL文本时调用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"开始解析MXL了!");
}
/**
*  MXL文本解析完成时调用
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"\nXML解析完成了\n%@",self.persons);
}
/**
*  当解析器读到起始标签会调用
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//    NSLog(@"elementName:%@namespaceURI:%@qName:%@attributeDict:%@",elementName,namespaceURI,qName,attributeDict);
//缓存起始标签
self.keyName = elementName;
if ([elementName isEqualToString:@"person"]) {
[self.persons addObject:[NSMutableDictionary dictionaryWithCapacity:1]];
}
}
/**
*  当读到结束标签时调用
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
self.keyName = nil;
}
/**
*  当解析到节点时调用此方法
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSMutableDictionary *dic = [self.persons lastObject];
if ([self.keyName isEqualToString:@"name"]) {
[dic setValue:@"name" forKey:string];
}
else if ([self.keyName isEqualToString:@"gender"]) {
[dic setValue:@"gender" forKey:string];
}
else if ([self.keyName isEqualToString:@"age"]) {
[dic setValue:@"age" forKey:string];
}
else if ([self.keyName isEqualToString:@"name"]) {
[dic setValue:@"name" forKey:string];
}
else if ([self.keyName isEqualToString:@"name"]) {
[dic setValue:@"name" forKey:string];
}
}


2.DOM解析

DOM解析:解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。当文件内容出现错误时,在输入框内会标记出错误的位置。

GDataXMLNode是Google提供的开元XML解析类,对libxml2.dylib进行了Objective-C的封装,因此在使用GDataXML之前,你需要先导入libxml2。

iOS中包含一个C语言的动态链接库libxml2.dylib,解析速度比NSXMLParser快,在此就不赘述了。

JSON解析

JSON解析的方法很多,第三方的解析工具主要有:JSONKit、SBJson、TouchJSON(性能从左到右,越差),个人偏向于使用原生的NSJSONSerialization来做JSON的解析,因为它性能最优。

NSJSONSerialization主要用到的就下面两个方法

+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;


JSON解析打码如下:

//1.创获取文件路径
NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
//2.解析JSON
id obj = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:pathStr] optio
4000
ns:NSJSONReadingAllowFragments error:nil];
//3.打印解析结果
NSLog(@"\nJSON解析完成了\n%@",obj);


项目代码下载

代码下载请猛戳这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml json ios 解析