概述

如上篇博客点击打开链接介绍。互联网公司发布Web服务,于是开发者们就可以将其用到自己的应用中。Web服务的工作方式类似于浏览器,输入请求,按下回车,等待远程计算机响应。当响应返回时,浏览器会使用响应中的规划与内容显示网页。Web服务的工作方式也与其相同,只不过是由应用发送请求。
互联网公司会尽可能的通过标准格式来规划Web服务的请求与响应,是应用能够更轻松地使用他们的服务。Web请求是字符串,Web响应是格式化为XML或JSON的字符串。


XML与XML解析

XML


XML是一门可标记扩展语言
是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型。是一种允许用户对自己的标记语言进行定义的源语言。
易读性高,编码手写难度小,数据量大。

在IOS中,Plist,XIB或者Stroyboard都是XML文件,例如下图就是Storyboard源代码的一部分:



XML解析方法


1.  SAX(Simple API for XML)
这是NSXMLParser默认的解析方式。
该方式只能读不能改,只能顺序访问,适合解析大型的XML,解析速度快。
常用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台。
从文档开始的每个节点移动,定位一个特定节点。

2.DOM
能读能改,能随机访问,但解析速度慢,适合小型的文档。
为载入到内存的文档节点建立类型描述,呈现可横向移动,潜在巨大的树型结构。
在内存中生成节点树的操作代价昂贵。


NSXMLParser解析


XML解析有很多框架,这里使用苹果自带的NSXMLParser。

解析步骤:
创建实例——定义代理——运行解析器——通过代理方法完成解析工作

示例:

- (void)startXMLParse
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"provinces" ofType:@"xml"];
NSURL *fileURL = [NSURL fileURLWithPath:path]; NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:fileURL];
parser.delegate = self; [parser parse];
}

我这里是访问了一个本地的XML文档代替网络连接,使用网络连接换个URL即可,

XML文档部分如下图



然后开始实现代理方法

//解析开始
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
if (!_xmlString)
{
_xmlString = [NSMutableString stringWithString:@"xml data : {\n"];
}
} //遍历XML, 识别节点名称
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"节点开始");
if ([elementName isEqualToString:@"plist"])
{
NSNumber *version = attributeDict[@"version"];
[_xmlString appendFormat:@"version: %@", version];
}
} - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[_xmlString appendString:string];
} - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"节点结束");
} - (void)parserDidEndDocument:(NSXMLParser *)parser
{
[_xmlString appendString:@"}"];
NSLog(@"%@", _xmlString);
_xmlString.string = @"";
;
} - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
assert(parseError);
}

代理方法比较多,看起来思路会跳跃,但是整体顺序掌握了,一步步解析就可以。



JSON与JSON解析


JSON

是一种轻量级的数据交换格式,正逐步取代XML,成为网络数据的通用格式。
基于JavaScript的一个子集。
易读性比较差,编码手写难度大,数据量小。
JSON格式给网络传输带来便利,但没有XML一目了然,尤其是数据很长的时候,会陷入繁杂的结点查找- -

下面是一个JSON数据的样式,{}表示对象,[]表示数组。
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}


JSON解析


JSON解析的框架有很多,以前很多公司使用SBJSON(=o=)框架,不过IOS5以后苹果开放了一个新的JSON序列化的API,很多方面都优于一些开源框架,所以比较推荐使用NSJSONSerialization类来进行JSON解析。 

示例:

- (void)serializeJSONData
{
NSURL *url = [NSURL URLWithString:@"your json request url"]; //输入请求的url
NSData *data = [NSData dataWithContentsOfURL:url]; NSError *error;
NSArray *array = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error]; //这里假设请求到的数据为一个数组
if (error)
{
assert(error);
} // 将请求到的数据写到一个文件中进行保存 或者方便查看结构
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents[0] stringByAppendingPathComponent:@"data.plist"]; BOOL success = [array writeToFile:path atomically:YES];
if (!success)
{
NSLog(@"写入失败");
}
}

通过比较可以看出序列化JSON格式的数据明显要轻松一些,而且由于JSON轻量,易于传输等优点,JSON正在逐步取代XML的地位,成为主要的数据传输格式。


demo示例点击打开链接

以上为本篇博客全部内容,欢迎指正和交流。转载注明出处~

网络编程——XML与JSON的更多相关文章

  1. :Android网络编程--XML之解析方式:SAX

    任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetMan ...

  2. iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍

    网络编程:HTTP协议.XML数据协议.JSON数据协议: HTTP: 1.HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式. 说明:同步和异步请求方式在创建链接对象和 ...

  3. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  4. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  5. python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01

    面向对象补充知识点(面向对象的应用) 扩展json序列化所支持的数据类型(分析源码) import json from datetime import datetime, date # ------- ...

  6. iOS 网络编程:JSON解析

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. HTTP请求 GET POST 网络编程实现

      HTTP请求 GET POST 网络编程实现(转) 原文地址 http://bbs.neworigin.net/forum.php?mod=viewthread&tid=488 在开发网络 ...

  8. ios网络编程学习

    //网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...

  9. 网络编程:Http通信与Socket通信

    http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note 网络编程:Http通信与Socket通信 ...

随机推荐

  1. HDU 4070 Phage War

    贪心,t 大的放到前面...因为感染所有cell需要的phage的总数是一定的,所以产生phage需要的时间是一定的,只需要考虑用来感染的时间,这样考虑的话,把 t 小的放后面的话,可以发现总时间的最 ...

  2. oracle批量插入数据

    有一次开发一个功能,须要导入别人提供的几万条数据, 数据在一个*.sql文件里,大概有8万条数据 insert into testtable(id,name) values(1,'1')   ---- ...

  3. Swift - 创建并设置背景(SpriteKit游戏开发)

    1,先把背景图片bg.jpg,bg@2x.jpg直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  4. uva 10603

    紫皮书的例题 照着敲了一遍,非原创 大题思路主要是三杯水,而水的总数是知道的,相当于知道第一第二杯水的体积,第三杯水的体积也就确定了. 用第一第二杯水的体积来标记数组是否遍历过 优先队列来找移动体积最 ...

  5. linux下的php网站放到Windows服务器IIS下.htaccess文件伪静态规则转换

    此办法只适合于linux下的php网站放到Windows服务器IIS下 ,  网站除了主页面正常以外  子页面全部出现404错误    这里子页面出现404 错误是说明伪静态没有开启 什么是.htac ...

  6. mysqldump --flush-logs

    <pre name="code" class="html"><pre name="code" class="ht ...

  7. 14.2.5.2 Clustered and Secondary Indexes

    14.2.5.2 Clustered and Secondary Indexes : 每个InnoDB 表 有一个特别的索引称为clustered index 行数据存储的地方. 典型的,cluste ...

  8. Hibernate(五)——经典解析一对一关联映射

    前面两篇介绍了多对一.一对多的映射.今天分享下一对一的关联映射关系.有两种策略可以实现一对一的关联映射:主键关联.唯一外键关联. 主键关联——两个表有完全相同的主键值,来表示它们的一对一的关系.数据库 ...

  9. hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题

    题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内. 只要用筛选法打出素数表,枚举查询下就行了. 我用set储存素数,然后遍历set里面的元素,查询+x后是否还 ...

  10. AMR音频编码器概述及文件格式分析

    全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的. 一.分类 1. AMR: ...