这是最近开始学的东西,东西有点多,所以先总结一番
首先是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语法中是非法的,需要使用实体引用来表示。具体的转换如下:
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 单引号 |
" | " | 引号 |
二、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>
暂时先写这些。。关于这部分还不是很熟悉,之后如果接触得多了再补充上