iOSXML & JSON 简介
XML & JSON 简介
// 1. 开始解析XML文档
- (void)parserDidStartDocument:
// 2. 开始解析某个元素,会遍历整个XML,识别元素节点名称
- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
// 3. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销
- (void)parser:foundCharacters:
// 4. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息
- (void)parser:didEndElement:namespaceURI:qualifiedName:
注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止
// 5. 解析XML文档结束
- (void)parserDidEndDocument:
// 6. 解析出错
- (void)parser:parseErrorOccurred:
实例代码
#import "DemoViewController.h"
#import "UIImageView+WebCache.h"
#import "Video.h"
#import "VideoCell.h"
#define kBaseURL @"http://192.168.3.251/~apple"
@interface DemoViewController () <NSXMLParserDelegate>
{
NSMutableArray *_dataList;
UIImage *_placeHolderImage;
// 以下是XML解析需要的成员变量
NSMutableString *_elementString; // 拼接的字符串
Video *_currentVideo; // 当前解析的视频模型对象
}
@end
@implementation DemoViewController
/**
数据处理过程
1> 从服务器上加载不同类型的数据JSON/XML
2> 将接收到的数据转换成对象数组
3> 在表格中显示数组内容
XML解析的六个步骤
1. 开始解析文档,在这里做初始化工作
2.3.4会循环执行,一直到XML文档解析完毕
2. 解析一个节点
3. 查找节点内容,可能会多次
4. 节点完成
5. 解析完成,做收尾工作
6. 解析出错,清理中间数据
*/
- (void)viewDidLoad
{
[super viewDidLoad];
// 设置标题
self.title = (_loadType == kLoadDataJSON) ? @"JSON" : @"XML";
_placeHolderImage = [UIImage imageNamed:@"user_default"];
if (_loadType == kLoadDataJSON) {
[self loadJSON];
} else {
[self loadXML];
}
}
#pragma mark - 表格的数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _dataList.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *ID = @"MyCell";
VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 设置单元格
Video *video = _dataList[indexPath.row];
cell.videoTitleLabel.text = video.name;
cell.teacherLabel.text = video.teacher;
cell.lengthLabel.text = video.lengthStr;
// 设置图像
// 完整的URL
NSString *imageURLStr = [NSString stringWithFormat:@"%@%@", kBaseURL, video.imageURL];
NSURL *url = [NSURL URLWithString:imageURLStr];
[cell.icon setImageWithURL:url placeholderImage:_placeHolderImage];
return cell;
}
#pragma mark - 数据加载方法
- (void)loadJSON
{
// 1. 从服务器获取数据 GET
// 1) url
NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast/videos.php?format=json"];
// 2) request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
// 3) 连接同步,可以让用户先有内容可看
NSError *error;
// NSData存放的是二进制的数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
// 判断返回结果
if (data != nil) {
// 正常返回数据
// NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"%@", result);
// 反序列化
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", array);
// 技巧,从网络上接收到JSON,为了方便阅读,可以将其反序列化之后,保存至文件
[array writeToFile:@"/Users/apple/Desktop/123.plist" atomically:YES];
// 将数据转换成模型,并保存至表格需要的数组中
NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:array.count];
for (NSDictionary *dict in array) {
Video *video = [[Video alloc] init];
[video setValuesForKeysWithDictionary:dict];
[arrayM addObject:video];
}
_dataList = arrayM;
} else if (error == nil) {
NSLog(@"返回空数据");
} else {
NSLog(@"%@", error.localizedDescription);
}
}
#pragma mark 解析XML
- (void)loadXML
{
// 1. 从服务器获取数据 GET
// 1) url
NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast/videos.php?format=xml"];
// 2) request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
// 3) 连接同步,可以让用户先有内容可看
NSError *error;
// NSData存放的是二进制的数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
// 2. XML解析
// 1) 解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2) 设置代理
parser.delegate = self;
// 3)开始解析
[parser parse];
}
#pragma mark - XML解析方法
// 1. 开始解析文档,在这里做初始化工作
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"开始解析文档");
// 数组还没有被初始化,初始化数组
_dataList = [NSMutableArray array];
_elementString = [NSMutableString string];
}
// 2.3.4会循环执行,一直到XML文档解析完毕
// 2. 解析一个节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"节点开始 %@ %@", elementName, attributeDict);
if ([elementName isEqualToString:@"video"]) {
// 新建一个视频模型对象
_currentVideo = [[Video alloc] init];
// 取视频ID
_currentVideo.videoId = [attributeDict[@"videoId"] integerValue];
}
// 清空拼接字符串
[_elementString setString:@""];
}
// 3. 查找节点内容,可能会多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"开始查找内容 %@", string);
// 拼接字符串
[_elementString appendString:string];
}
// 4. 节点完成
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"节点完成 %@ %p", elementName, _elementString);
NSString *result = [NSString stringWithString:_elementString];
if ([elementName isEqualToString:@"video"]) {
// 对象的属性填充完毕,添加到数组
[_dataList addObject:_currentVideo];
} else if ([elementName isEqualToString:@"length"]) {
_currentVideo.length = [result integerValue];
} else if (![elementName isEqualToString:@"videos"]) {
// 利用KVC给字符串类型的属性赋值
[_currentVideo setValue:result forKey:elementName];
}
// else if ([elementName isEqualToString:@"name"]) {
// _currentVideo.name = result;
// } else if ([elementName isEqualToString:@"length"]) {
// _currentVideo.length = [result integerValue];
// } else if ([elementName isEqualToString:@"videoURL"]) {
// _currentVideo.videoURL = result;
// } else if ([elementName isEqualToString:@"imageURL"]) {
// _currentVideo.imageURL = result;
// } else if ([elementName isEqualToString:@"desc"]) {
// _currentVideo.desc = result;
// } else if ([elementName isEqualToString:@"teacher"]) {
// _currentVideo.teacher = result;
// }
}
// 5. 解析完成,做收尾工作
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析完成");
NSLog(@"%@", _dataList);
}
// 6. 解析出错,清理中间数据
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"%@", parseError.localizedDescription);
// 一旦解析发生错误,需要把解析过程中生成的记录全部清除,以免造成不必要的麻烦
[_dataList removeAllObjects];
}
@end
iOSXML & JSON 简介的更多相关文章
- json简介及JsonCpp用法
[时间:2017-04] [状态:Open] [关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource] json简介 本文仅仅是添加我个人对json格式的理解,更 ...
- JSON 简介
ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- js json简介(json的本质也是字符串)(用于服务器和客户端通信)
js json简介(json的本质也是字符串)(用于服务器和客户端通信) 一.总结 1.json的语法和js的语法非常像,只是json的键和值都是双引号,因为json的本质也是字符串 2.json是一 ...
- JSON简介
JSON的全称是JavaScript Object Notion,即JavaScript对象符号,它是一种轻量级的数据交换格式,JSON的数据格式既适合人来读/写,也适合计算机本身解析和生成.最早 ...
- JSON简介以及用法汇总
什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...
- Json简介与转换数据例子
Json是什么,Json就是javascript对象或者数组格式的字符串,Http协议不能传递JavaScript对象,所以要转换为字符串进行传输.AJAX传递复杂数据如果自己进行格式定义的话会经历组 ...
- ASP.NET 将DataTable解析成JSON简介
这里解析json使用的是Newtonsoft.Json.dll程序集.下面请看code: using System; using System.Collections.Generic; using S ...
- JSON简介以及用法代码汇总
什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...
随机推荐
- SoapUI实践:自动化测试、压力测试、持续集成
因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api.下面将研究的成果展示给大家,希望对需要的人有所帮助. SoapUI 是什么? SoapUI 是一个开源测试工具,通过 ...
- JAVA基础4——谈谈HashCode与HashMap相关概念
谈谈HashCode与HashMap HashCode hashCode,即一个Object的散列码. HashCode的作用: 对于List.数组等集合而言,HashCode用途不大: 对于Hash ...
- python基础0
1.运行:D:\tools\python\python-2.7.10.amd64=>安装到c:\python 2.环境变量:path:c:\Python27 3.cmd:python回车 //s ...
- MyEclipse Java基础使用笔记
一.Java开发平台 JavaSE 标准版 Java应用程序 application 五子棋.计算器.qq JavaEE 企业版 Java企业级应用 JavaME 微型版 小型设备 A ...
- javascript语言基础
js的基本语法 /* 多行注释 * */ //单行注释 // 变量赋值 默认以换行符作为结束符,有分号以分号作为结束符号 var i; i=10; s="hello"; var b ...
- Linux服务器制定mysql数据库备份的计划任务
首先,创建一个shell脚本: Shell #!/bin/bash mysql_pwd="1234567890" mysql_dump="/usr/local/mysql ...
- jQuer __Ajax DOM
链接:在线jQueryhttp://www.bootcdn.cn 一.each(遍历) $("ul li").each(function(index,value){ ale ...
- OpenCASCADE入门指南
OpenCASCADE入门指南 eryar@163.com 一.概述 荀子说“君子性非异也,善假于物也”.当你会用英语,就可以与世界各国的人交流:当你会用编程语言,就可以与计算机交流:当你会用数学语言 ...
- 》》3D轮播
* { margin: 0; padding: 0; } .slide { position: absolute; top: calc(50% - 150px); left: calc(50% - 3 ...
- 分布式文件系统及FastDFS
1.前言 今天来谈谈分布式文件系统,侧重点是文件系统,分布式稍微带一下.然后聊下我用的FastDFS的例子. 2.从小需求开始 我的博客的编辑器用的是markdown,它内嵌了一个文件上传功能,不过后 ...