iOS进阶学习-网络之数据解析

一、解析的基本概念

  • 所谓“解析”:从事先规定好的格式中提取数据。
  • 解析的前提:提前约定好格式,数据提供方按照格式提供数据、数据获取方则按照格式获取数据。
  • iOS开发常见的解析:XML解析、JSON解析。

二、XML数据结构

  • XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据。
  • XML数据格式的功能:数据交换,内容管理,用作配置文件。
  • XML数据结构的语法:1)声明;2)节点使用一堆标签表示;3)根节点是起始节点,只有一个,节点可以嵌套4)节点可以有值,存储在一对儿标签中。

三、进行XML数据结构解析时使用到的SAX工具,DOM工具

  1、SAX工具:

  • SAX解析:SAX(Simple API for XML),基于时间驱动的解析方式,逐行解析数据。(采用协议回调机制)。
  • NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据。
  • 解析过程由NSXMLParserDelegate协议方法回调。
  • 解析过程:开始标签->取值->结束标签->取值
  • 初始化NSXMLParser:
#pragma mark - sax解析XML文件
- (IBAction)saxParserActionXMLDocument:(UIButton *)sender {
    // 1.获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentsInfo_XML" ofType:@"txt"];
    // 2.获取出NSData类型的数据
    NSData *data = [NSData dataWithContentsOfFile:path];// 3.设置SAX解析,并关联相关的xml文件
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 4.设置代理
    parser.delegate = self;
    // 5.开始解析
    [parser parse];
} 
  • NSXMLParserDelegate的协议方法:
#pragma mark - NSXMLParserDelegate的协议方法
// 1.文档解析(报告解析的开始)
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    // 初始化存储数据的数组
    self.dataArray = [[NSMutableArray alloc] init];
}
// 2.发现标签开始的处理函数(即报告元素的开始以及元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    // 根据需求需要的标签去获取相关的数据
    if ([elementName isEqualToString:@"student"]) {
        Student *stu = [[Student alloc] init];
        // 将数据对象添加到数组中
        [self.dataArray addObject:stu];
    }
    // 将当前的标签值传给记录标签的属性
    self.currentElement = elementName;
}
// 3.解析标签中的内容,然后赋值给对象
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    // 从数组中取出相关的student对象,每次从数组中取最后一个元素,保证每次取出最新的对象内容
    Student *stu = [self.dataArray lastObject];
    // KVC赋值
    [stu setValue:string forKey:self.currentElement];

}
// 4.结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    self.currentElement = nil;
}
// 5.结束文档解析(报告解析的结束)
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    for (Student *stu in self.dataArray) {
        NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby);
    }
}
// 6.错误处理
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"error = %@", parseError);
}

  2、DOM工具

  • DOM解析:DOM(Document Object Model)DOM方式解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点数),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
  • GDataXMLNode:采用DOM方式解析数据;iOS中包含一个C语言的动态链接库libxml2.dylib(xcode7以后改为libxml2.tab),解析速度比NSXMLParser快;GDataXMLNode是Google提供的开源XML解析类,对libxml2.tab进行了Objective-C的封装,能对较小或中等的xml文档进行读写操作且支持Path语法。
  • GDataXMLNode使用方法:
  • 获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中。
  • 向工程中增加“libxml2.tab”动态库。
  • 这时编译会报错:
  • 原因如下:
  • 具体操作:
  • 在工程的“Build Settings”页中找到“Header Search Path”项,添加“/usr/include/libxml2”,找到“Other Linker Flags”项,添加“-lxml2”。
  • 这时编译如果工程报如下错误:
  • 此错误为非ARC文件无法在ARC工程下运行的错误,解决办法:找到相应工程文件,添加-fno-objc-arc,反之添加-fobjc-arc。图示:
  • 导入“GDataXMLNode.h”文件到头文件中,如工程能编译通过,则说明GDataXMLNode添加成功。
  • 代码示例:
#pragma mark - dom解析XML文件
- (IBAction)domParserActionXMLDocument:(id)sender {
    // 首先引入动态库
    // 1.获取文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentsInfo_XML" ofType:@"txt"];
    // 2.获取出NSData类型的数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 初始化存储数据的数组
    self.dataArray = [[NSMutableArray alloc] init];
    // 3.设置DOM解析(创建解析文档)
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    // 4.获取根节点
    GDataXMLElement *rootElement = document.rootElement;
    // 5.遍历获取相对应的子节点
    for (GDataXMLElement *studentElement in rootElement.children) {
        Student *stu = [[Student alloc] init];
        // 遍历获取子节点的子节点
        for (GDataXMLElement *stuElement in studentElement.children) {
            NSLog(@"stuElement = %@", stuElement);
            // 根据标签给student对象赋值
            // stuElement.name 标签的名字
            // stuElement.stringValue 标签的值
            [stu setValue:stuElement.stringValue forKey:stuElement.name];
        }
        [self.dataArray addObject:stu];

    }
    for (Student *stu in self.dataArray) {
        NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby);
    }
}

四、JSON数据结构

  1、JSON数据结构的概念:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,易于阅读和编写,同时也易于机器解析和生成。这些特性使JSON成为理想的数据交换语言。

  2、JSON文件有两种结构:

  • 对象:“名称/值”对的集合。不同的语言中,它被理解为对象,记录,结构,字典,哈希表,有键列表,或者关联数组。以“{”开始,以“}”结束,是“名称/值”对的集合。名称和值中间用“:”隔开。多个“名称/值”对之间用“,”隔开。
  • 数组:值得有序列表。在大部分语言中,它被理解为数组。以“[”开始,以“]”结束,中间是数据以“,”分隔。
  • JSON中的数据类型:字符串、数值、BOOL、对象、数组。
  • JSON数据结构的功能:数据交换,内容管理,配置文件。
  • JSON数据示例:

五、进行JSON数据结构解析时使用到的第三方框架以及系统方法

  1、系统方法解析JSON数据:

#pragma mark - 系统自带的JSON数据解析
- (IBAction)foundationParserActionJSONDocument:(id)sender {
    // 1.获取文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"];
    // 2.获取出NSData类型的数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 初始化存储数据的数组
    self.dataArray = [[NSMutableArray alloc] init];
    // 3.解析数据
    NSArray *resultArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    // 4.遍历数组,使用KVC给对象赋值
    for (NSDictionary *dict in resultArray) {
        Student *stu = [[Student alloc] init];
        [stu setValuesForKeysWithDictionary:dict];
        [self.dataArray addObject:stu];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby);
    }

}

  2、使用JSONKit解析json数据:先引入第三方框架JSONKit.h/m文件,按照上面的步骤将非ARC文件在ARC工程下使用。

#pragma mark - 使用JSONKit解析json数据
- (IBAction)jsonKitParserActionJSONDocument:(id)sender {
    // 1.获取文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"];
    // 2.获取出NSData类型的数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 初始化存储数据的数组
    self.dataArray = [[NSMutableArray alloc] init];
    // 3.解析数据
    NSArray *resultArray = [data objectFromJSONData];
    // 4.遍历数组,取出其中的字典,然后使用KVC给对象赋值
    for (NSDictionary *dict in resultArray) {
        Student *stu = [[Student alloc] init];
        [stu setValuesForKeysWithDictionary:dict];
        [self.dataArray addObject:stu];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby);
    }

}

六、XML与JSON两种数据结构的优缺点

  1、XML优缺点:

  • 优点:
  • 格式统一,符合标准。
  • 容易与其他系统进行远程交互,数据共享比较方便。
  • 缺点:
  • XML文件格式文件庞大,格式复杂,传输占用带宽。
  • 服务器端和客户端都需要花费大量代码来解析XML,不论服务器端还是客户端都使代码变得异常复杂和不容易维护。
  • 客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码。
  • 服务器端和客户端解析XML花费资源和时间。

  2、JSON优缺点:

  • 优点:
  • 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小。
  • 易于解析这种语言。
  • 支持多种语言,包括ActionScript,C,C#,ColdFusion,JAVA,JAVAScript,Perl,PHP,Python,Ruby等语言服务器端语言,便于服务器端的解析。
  • 因为JSON格式能够直接为服务器端代码使用,大大 简化了服务器端和客户端的代码开发量,但是完成的任务不变,且易于维护。
  • 缺点:
  • 没有XML格式推广的深入人心和使用广泛,通用性不如XML。
  • JSON格式目前在Web Service中推广还属于初级阶段。
时间: 2024-10-30 10:30:02

iOS进阶学习-网络之数据解析的相关文章

iOS进阶学习-网络之数据请求

注:文中出现的网站只做用例子,所以有些已经失效的网站,具体URL大家可以自己上网搜索相关资源. 一.HTTP和HTTPS协议 1.URL: URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URL URL的基本格式=协议://主机地址/路径 http://www.cnblogs.com/soley 协议:不同的协议,代表着不同的资源查找方式,资源传输方式 主机地址

iOS进阶学习-网络之数据安全

一.数据安全 1.术语: 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥). 明文:没有进行加密,能够直接代表原文含义的信息. 密文:经过加密处理处理之后,隐藏原文含义的信息. 加密:将明文转换成密文的实施过程. 解密:将密文转换成明文的实施过程. 2.数据安全 数据安全:是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系,主要是有对称算法与公开密钥密码体系两种(非对称算法),

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

零基础iOS之Json及XML数据解析2

零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html

iOS开发——网络篇&amp;数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

iOS进阶学习-初识AFNetworking

一.AFNetworking简介 AFNetworking是一个 在iOS开发中 使用非常多网络开源库 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松. 官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/. AFNetworking

iOS中从网络获取数据的几种方法的比较

IOS中获取网络数据一般有三种:1.NSURLCondition(已过时) 2.NSURLSession  3.三方库AFNetWorking NSURLSession 是苹果对NSULRCondition的替代品,NSURLSession比NSURLCondition多了 1.可配置的数据信息NSURLSessionConfiguration,NSURLSessionConfiguration使你可以设置你要请求的数据,通常的设置如缓存,也可以使用默认的配置信息defaultCongurati

ios之NSURLConnection网络请求数据/GET与POST方法

目前可能只是单纯的贴上了一些demo的代码,但是这些代码都是请求数据应该是最基础的使用方法吧,在项目的实际开发中可能用到系统的会非常少,一般都是采用别人非常成熟的第三方开源库来实现数据请求,目前常用的第三方网络请求主要是以下几个:<h3 style="margin: 18px 0px; padding: 0px 0px 5px; border: 0px; outline: 0px; font-size: 22px; vertical-align: baseline; color: rgb(

网络之数据解析

(一) 解析: 从事先规定好的格式中提取数据; 前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据. 常见的解析:XML JSON. 前四个页面.当点击页面时触发效果.所以代码写在touchsBegan中 //第五个页面(viewController) : (二)XML 数据结构 (主要用于天气预报) XML: Extensible Markup language (可扩展标记语言);可用来存储和传输数据; 功能:数据交换 ,, 内容管理 ,, 用作配置文件 语法: