2.4 XML解析与JSON解析与初识NSURLSession

这是最近开始学的东西,东西有点多,所以先总结一番

首先是XML与JSON部分。这两者都是为了传输和存储数据而诞生的,语法比较简单,类似于OC中的字典和数组

一、XML语法相关

开头一般会有声明,虽然不是必须项但基本都会加上,一般为

<?xml version="1.0" encoding="utf-8"?>

声明了xml版本还有编码方式,常用的为1.0和utf-8。

之后就是根元素。一个xml中只可以存在一个根元素,我尝试过弄了2个根元素结果也只有第一个可以解析得出来。。

元素头尾用<root></root>这样的格式包围起来,<root>称为标签,用来代表这个元素的属性

同时也可以给标签添加属性,比如这样的格式:

<type id="teacher" class="2"></type>

添加的属性应该为 键-值 对,格式到了OC中便是字典格式了

标签相同的各个元素是以类似数组的形式存在的,这个数组有一个键值,便是这个标签

另外,&和<在XML语法中是非法的,需要使用实体引用来表示。具体的转换如下:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号


二、JSON语法相关

可参考这个:http://www.w3school.com.cn/json/json_syntax.asp

基本就是一个字典对象。

一般先是有一个花括号(表示字典),在花括号中添加各种元素,元素采用

"key":"object" 

这样的形式表示 键-值 对,

采用

[obj1,obj2,obj3...]

表示数组

上面两者互相嵌套便可以组合成各种复杂的形式

JSON中的数据类型可以是

数字(整型或浮点型)、字符串(需要用双引号)、逻辑值(BOOL类型)、NULL

另外附上一个在线校验JSON的网站:

http://www.bejson.com


三、XML解析

关于XML的解析方式可以有2种,分别为SAX(逐行解析)和DOM(先整个导入,再查找特定节点来解析)两种。

通过苹果自带的NSXMLParse来解析的话用的便是第一种方式,虽然使用起来蛮复杂。。

(1)、使用NSXMLParse进行解析的过程

首先需要继承协议<NSXMLParseDelegate>,

然后通过

   NSString *path = [[NSBundlemainBundle]pathForResource:@"myXml"ofType:@".xml"];

    NSData *data = [NSDatadataWithContentsOfFile:path];

    //读取路径

    self.par = [[NSXMLParseralloc]initWithData:data];

    //读取xml文件

    self.par.delegate =self;

    //设置解析协议


把需要解析的xml准备好,并且初始化NSXMLParse,之后便是完成下面的协议方法:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict


通过这个方法设置开始解析的节点,读取到某个节点时便会获得NSString的elementName,这个是标签内容,并且还可以通过attributeDict获得标签内属性。

比如说可以当[elementName is Equal:@"root"]时便初始化xxx之类的

建议使用一个变量来存储elementName内容,可以在后面根据elementName来获得不同的标签内容



- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

通过这个方法来设置解析中遇到标签中内容时做出的反应(即<>  </>中间那部分的内容),获得内容为NSString格式的string


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

设置解析完这个标签时所执行的方法。


另外的还有这样的方法:

- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析...");
}

开始解析时候执行的方法


- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"解析结束");
}

解析结束时的方法



把代理方法设置完后,通过

[self.par parse]

就可以开始解析了


(2)使用GDataXML

1、首先把下载来的GDataXMLNode导入工程,在需要解析XML的地方导入

#import "GDataXMLNode/GDataXMLNode.h"

2、在项目设置的Build Phases中的Link Binary With Libraries中加入libxml2.tbd(xcode7.0以上)

3、在Build Settings中搜索Header Search Paths,添加/usr/include/libxml2


这样配置完毕之后就可以使用GDataXML来解析了





四、JSON解析

JSON的解析相对来说要简单一些,只要使用苹果原声的NSJSONSerialization类,就可以很方便地进行解析了,而且据说效果很好

在已经存在.json文件的情况下,也是需要先获得数据

   NSString *path = [[NSBundle mainBundle]pathForResource:@"myJSON" ofType:@".json"];

    NSData *data = [NSData dataWithContentsOfFile:path];


之后,创建一个字典类型的dic来存放转换之后的json,这里直接创建了一个名为dic的字典

然后使用下面的方法

        self.dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

通过NSJSONSerialization的这个方法,直接把.json文件转换成字典格式保存下来,之后就可以使用啦



五、NSURLSession的使用

JSON文件可以通过网站给开发者提供的api借口获得,于是在做json解析的时候,便使用了豆瓣读书的api接口,这里就涉及到了NSURLSession

给一个很详细的参考的文章:http://blog.csdn.net/djl4104804/article/details/22667273


NSURLSession下3个子类:NSURLSessionDataTask,NSURLSessionDownloadTask,NSURLSessionUploadTask,分别对应数据的加载获取、文件的下载与文件的上传三个任务。

其中NSURLSessionUploadTask是NSURLSessionDataTask的子类

使用方法如下:

NSURLSessionDataTask:

NSURL *URL = [NSURL URLWithString:@"http://example.com"];//获取请求的地址
 NSURLRequest *request = [NSURLRequest requestWithURL:URL];//发出请求

 NSURLSession *session = [NSURLSession sharedSession];
 NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                         completionHandler:
     ^(NSData *data, NSURLResponse *response, NSError *error) {
         // ...
     }];//服务器响应后获得的数据保存为NSData类型的data,另外还有NSURLResponse类型的响应response


 [task resume];//配置完之后执行task,运行完后立刻返回,所以在后面打印获得的data什么的输出的会是nill




NSURLSessionUploadTask:

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
 NSURLRequest *request = [NSURLRequest requestWithURL:URL];


 NSData *data = ...;//这个是需要上传的文件,注意类型为NSData


 NSURLSession *session = [NSURLSession sharedSession];
 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request
                                                            fromData:data
                                                   completionHandler:
     ^(NSData *data, NSURLResponse *response, NSError *error) {
         // ...
     }];


 [uploadTask resume];//同样也是完成后立刻返回




NSURLSessionDownloadTask:

NSURL *URL = [NSURL URLWithString:@"http://example.com/file.zip"];
 NSURLRequest *request = [NSURLRequest requestWithURL:URL];
 NSURLSession *session = [NSURLSession sharedSession];
 NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request
                                                         completionHandler:
    ^(NSURL *location, NSURLResponse *response, NSError *error) {
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

//这里应该是设置下载来的文件的保存路径的


        NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
        return [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];
    }];


 [downloadTask resume];//完成后不会立刻返回,因为需要将文件移动到一个永久位置,这个位置便是上面的block的返回值




另外,iOS9之后,苹果将原HTTP协议改成了HTTPS协议,发送请求的URL为HTTP的,需要改变info.plist中的配置,否则会导致无法连接服务器

具体改动如下:

在info.plist中添加
<key>NSAppTransportSecurity</key><dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/></dict>




暂时先写这些。。关于这部分还不是很熟悉,之后如果接触得多了再补充上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值