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);
项目代码下载
代码下载请猛戳这里相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 使用 Python 处理 JSON 格式的数据
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- XML 与 JSON 优劣对比
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- VBA将excel数据表生成JSON文件
- As3.0 xml + Loader应用代码
- DVI 视频接口图文解析
- IE6不能正常解析CSS文件问题的解决方法及原因分析
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
- Ruby中XML格式数据处理库REXML的使用方法指南
- newtonsoft.json解析天气数据出错解决方法