数据解析之XML和JSON
1. 解析的基本的概念
解析:从事先规定好的格式中提取数据
解析前提:提前约定好格式,数据提供方按照格式提供数据、数据获取方则按照格式获取数据
iOS开发常见的解析:XML解析、JOSN解析
2. XML数据结构
1> 概述
XML:Extensible markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据。
2> XML数据格式的功能
数据交换
内容管理
用作配置文件
3> XML数据格式的语法
声明
节点使用一对标签表示:起始和结束标签。
根节点是起始节点,只有一个,节点可以嵌套。
节点可以有值,存储在一对儿标签中。
4> XML实例
3. 使用SAX工具解析XML
1> 概述
Simple API for XML。基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)
2> NSXMLParser类概述
NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据
解析过程由NSXMLParserDelegate协议方法回调
解析过程:开始标签 --> 取值 --> 结束标签 --> 取值
3> 初始化NSXMLParser
使用NSXMLParser要先创建它,设置各种属性,主要用到一下几个方法:
4> NSXMLParserDelegate代理方法
5> 代码
#pragma mark - SAX解析xml文件
- (IBAction)saxParserActionXMLDocument:(UIButton *)sender
{
// 1. 获取文件路径(获取xcode中的文件路径)
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"]; // 2. 获取NSData类型的数据
NSData *data = [NSData dataWithContentsOfFile:path]; NSLog(@"data = %@", data); // 3. 设置SAX解析,并关联相关的xml文件
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 4. 设置代理
parser.delegate = self; // 5. 开始解析
[parser parse];
} #pragma mark NSXMLParserDelegate的协议方法 #pragma mark 1. 文档解析
- (void)parserDidStartDocument:(NSXMLParser *)parser
{ } #pragma mark 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 new]; // 在这里不需要赋值 // 将数据对象添加到数组中
[self.dataArray addObject:stu];
} // 将当前的标签值传给声明的标签属性
self.currentElement = elementName; } #pragma mark 3. 解析标签中的内容然后赋值给对象
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 从数组中取出相关的Student对象,每次取数组中最后的一个元素,保证值为最新的对象内容
Student *stu = [self.dataArray lastObject]; // KVC
[stu setValue:string forKey:self.currentElement]; } #pragma mark 4. 结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
self.currentElement = nil;
} #pragma mark 5. 结束文档解析
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
for (Student *stu in self.dataArray) {
NSLog(@"name = %@, gender = %@, age = %ld", stu.name, stu.gender, stu.age);
}
} #pragma mark 6. 错误处理
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"error = %@", parseError);
} - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
4. 使用DOM工具解析XML
1> 概述
DOM:Document Object
Model(文档对象模型)。DOM方式解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节
点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
2> GDataXMLNode概述
采用DOM方式解析数据
iOS中包含一个C语言的动态链接库libxml2.dylib(xcode7以后改为libxml2.tbd),解析速度比NSXMLParser快。
GDataXMLNode是Google提供的开源XML解析类,对libxml2.tbd进行了Objective-C的封装,能对较小或中等的xml文档进行读写操作且支持XPath语法。
3> GDataXMLNode使用方法
获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中。
编译后会出现一个错误
这是因为没有进行配置,朋友们不需要紧张,往下看配置。
向工程中增加“libxml2.tbd”动态库。
- 在工程的“Build Settings”页中找到“Header Search Path”项,添加/usr/include/libxml2”。
- 在工程的“Build Settings”页中找到“Other Linker Flags”项,添加“-lxml2”。
- 进行完配置后,编译后仍会出错
这个错误是因为 非ARC文件在ARC的环境运行时 的常见错误,解决办法:在 Build Phases 的 Compile Sources 中找到非ARC文件对应的 .m 文件, 将 Compiler Flags 的值设为 -fno-objc-arc
4> GDataXMLElement类的方法
5> 代码
#pragma mark - DOM解析xml文件
- (IBAction)domParserActionXMLDocument:(UIButton *)sender
{
// 第一步:引入动态库 // 1. 获取文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"]; // 2. 根据路径获取数据
NSData *data = [NSData dataWithContentsOfFile:path]; // 3. 设置DOM解析(创建解析文档)
// 第一个参数为数据
// 第二个参数为选择项,是一个int型的值,一般为 0
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options: error:nil]; // 4. 获取根节点
GDataXMLElement *rootElement = document.rootElement; // 5. 遍历获取相对应的子节点
for (GDataXMLElement *studentElement in rootElement.children) { Student *stu = [Student new];
// 遍历子节点的子节点
for (GDataXMLElement *propertyElement in studentElement.children) {
// NSLog(@"%@", propertyElement); // 根据标签给student赋值
// propertyElement.name 标签的名字
// propertyElement.stringValue 标签的值 // kvc
[stu setValue:propertyElement.stringValue forKey:propertyElement.name];
} [self.dataArray addObject:stu];
} for (Student *stu in self.dataArray) { NSLog(@"name = %@, gender = %@, age = %ld", stu.name, stu.gender, stu.age);
}
}
5. JOSN数据结构
1> 概述
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,易于阅读和编写,同时也易于机器解析和生成。这些特性使JSON成为理想的数据交换语言。
2> JSON数据结构的语法
- JSON文件有两种结构:
对象:“名称/值”对的集合。不同的语言中,它被理解为对象,记录,结构,字典,哈希表,有键列表,或者关联数组。以“{”开始,以“}”结束,是“名称/值”对的集合。名称和值中间用“:”隔开。多个“名称/值”对之间用“,”隔开。
数组: 值的有序列表。在大部分语言中,它被理解为数组。以“[”开始,以“]”结束,中间是数据。数据以“,”分隔。
- JSON中的数据类型:字符串、数值、BOOL、对象、数组。
3> JSON示例
4> JSON数据结构的功能
数据交换
内容管理
配置文件
6. 使用Foundation进行JSON解析
1> NSJSONSerialization
NSJSONSerialization 里面包含了两个方法来通过不同数据形式解析JSON数据。
- (IBAction)foundationParserActionJSONDocument:(UIButton *)sender
{
// 1. 获取文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"]; // 2. 根据路径获取数据
NSData *data = [NSData dataWithContentsOfFile:path]; // 3. 解析
// 第一个参数:数据
// 第二个参数:选择项,是一个int型的值,一般为 0
// 第三个参数:错误处理
NSArray *resultArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; // 4. 遍历数组,使用KVC赋值
for (NSDictionary *dict in resultArray) { Student *stu = [Student new]; [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);
}
}
7. 使用第三方JSONKit解析JSON数据
1> 获取JSONKit.h/m文件,将JSONKit.h/m文件添加到工程中。
源码下载地址:https://github.com/AlonerOwl/JSON-
导入后也需要进行一次 非ARC文件在ARC的环境运行时 所需要的配置,具体见 4. 3>...
2> 代码
#pragma mark - 使用JSONKit解析JSON数据
- (IBAction)jsonKitParserActionJSONDocument:(id)sender
{
// 1. 获取文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"]; // 2. 根据路径获取数据
NSData *data = [NSData dataWithContentsOfFile:path]; // 3. 解析
NSArray *resultArray = [data objectFromJSONData]; // 4. 遍历数组,使用KVC赋值
for (NSDictionary *dict in resultArray) { Student *stu = [Student new]; [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);
} }
8. 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中推广还属于初级阶段 。
数据解析之XML和JSON的更多相关文章
- 数据解析(XML和JSON数据结构)
一 解析 二 XML数据结构 三 JSON 数据结构 一 解析 1 定义: 从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...
- iOS开发之网络数据解析(一)--JSON解析简介
前言:对服务器请求之后,返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 本篇随便先讲解JSON解析. 正文: 关于JSON: JSON是一种轻量级的数据格式,一般用于数据交互 ...
- Java 常见数据交换格式——xml、json、yaml
目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...
- 数据交换格式XML和JSON对比
1.简介: XML:extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- Dreamer2.1 发布 新增将Bean解析成xml和json
一个上午,增加两个功能 1.直接将对象解析成XML 2.将对象解析成JSON 对象可以是数组,可以是集合,也可以是单个对象 源码和jar下载地址:http://pan.baidu.com/share/ ...
- Java数据解析之XML
文章大纲 一.XML解析介绍二.Java中XML解析介绍三.XML解析实战四.项目源码下载 一.XML解析介绍 最基础的XML解析方式有DOM和SAX,DOM和SAX是与平台无关的官方解析方式 ...
- SQL Server 将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...
- iOS开发——数据解析Swift篇&简单json数据处理
简单json数据处理 //loadWeather var url = NSURL(string: "http://www.weather.com.cn/adat/sk/101240701.h ...
随机推荐
- C# 委托和方法
委托是一种特殊的引用类型,它将方法也作为特殊的对象封装起来,从而将方法作为变量或参数进行传递 using System; using System.Collections.Generic; using ...
- MATLAB - 为什么imshow(g,[])可以正常显示,而imshow(g)却显示空白图像?
Q:为什么imshow(g,[])可以正常显示,而imshow(g)却显示空白图像? A:数据类型如果是double,imshow的处理范围是0-1数据类型如果是uint8,imshow的处理范围是0 ...
- fullPage.js插件用法(转发)
fullPage.js主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 支持 CSS3 动画 支持窗口缩放 窗口缩放时自动调整 可设置滚动宽度.背景颜色.滚动速 ...
- HTML+CSS笔记 CSS入门续集
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...
- Jass 技能模型定义(转)
Jass是什么? 先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础. 地图编辑器中摆放的单位(Un ...
- hdoj 1532 Drainage Ditches(最大网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路分析:问题为最大网络流问题,给定一个有向图,需要求解该有向图的最大网络流,使用Edmonds ...
- 一个简单二叉树的C++实现(一)
很久没有接触二叉树了,写这个当作练手,接下来会比较详细地实现二叉树的各个功能及应用. /* * BinaryTree.cpp * Author: Qiang Xiao * Time: 2015-07- ...
- Unqualified name lookup
Unqualified name lookup File scope Namespace scope For an qualified name, that is a name that does n ...
- scanf 与 cin 的区别
在论坛上看到有人提出一个如下的问题,在此总结一下. 原问题: http://topic.csdn.net/u/20110414/22/90d0606c-9876-48e4-9b69-bd8bd8a41 ...
- django开发简易博客(三)
一.静态文件的使用 首先,新建static目录,目录下分别建立css.js.img三个子目录 修改settings.py文件 STATICFILES_DIRS = ( 'F:/web/static', ...