网络编程——XML与JSON

概述


如上篇博客点击打开链接介绍。互联网公司发布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示例点击打开链接

以上为本篇博客全部内容,欢迎指正和交流。转载注明出处~
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值