XML & JSON 简介

•JSON
–作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式
–基于JavaScript的一个子集
–易读性略差,编码手写难度大,数据量小
–JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中
•JSON是轻量级的数据交换格式,正逐步取代XML,成为通用网络数据格式
•使用类方法JSONObjectWithData:options:error:可以将接收到的JSON数据反序列化为NSArray或NSDictionary等对象
•XML
–可扩展标记语言
–用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
–易读性高,编码手写难度小,数据量大
 
JSON格式说明
•对象: {} 括起来的内容
–数据结构为 {key:value,key:value,...}的键值对的结构
–可以反序列化为OC中的NSDictionary
•数组: []括起来的内容
–数据结构为 ["java","javascript","vb",...]
–可以反序列化为OC中的NSArray
Ø序列化:在传输之前,将对象转换成有序的字符串或者二进制数据流
Ø反序列化:将接收到的字符串或者二进制数据流转换成对象或者数组,以便程序访问
 
NSXMLParser解析方法
•NSXMLParser是SAX方法解析
–SAX(Simple API for XML)
•只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
•常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
•从文档的开始通过每一节点移动,定位一个特定的节点
–DOM(Document Object Model)
•不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
•一般应用与小型的配置XML,方便操作
•为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
•在内存中生成节点树操作代价昂贵
 
NSXMLParser解析过程
•1. 创建NSXMLParser实例,并传入从服务器接收的XML数据
•2. 定义解析器代理
•3. 解析器解析
•4. 通过解析代理方法完成XML数据的解析
 
NSXMLParser解析代理方法

// 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 简介的更多相关文章

  1. json简介及JsonCpp用法

    [时间:2017-04] [状态:Open] [关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource] json简介 本文仅仅是添加我个人对json格式的理解,更 ...

  2. JSON 简介

    ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...

  3. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  4. js json简介(json的本质也是字符串)(用于服务器和客户端通信)

    js json简介(json的本质也是字符串)(用于服务器和客户端通信) 一.总结 1.json的语法和js的语法非常像,只是json的键和值都是双引号,因为json的本质也是字符串 2.json是一 ...

  5. JSON简介

    JSON的全称是JavaScript  Object  Notion,即JavaScript对象符号,它是一种轻量级的数据交换格式,JSON的数据格式既适合人来读/写,也适合计算机本身解析和生成.最早 ...

  6. JSON简介以及用法汇总

    什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...

  7. Json简介与转换数据例子

    Json是什么,Json就是javascript对象或者数组格式的字符串,Http协议不能传递JavaScript对象,所以要转换为字符串进行传输.AJAX传递复杂数据如果自己进行格式定义的话会经历组 ...

  8. ASP.NET 将DataTable解析成JSON简介

    这里解析json使用的是Newtonsoft.Json.dll程序集.下面请看code: using System; using System.Collections.Generic; using S ...

  9. JSON简介以及用法代码汇总

    什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...

随机推荐

  1. NuGet的使用、部署、搭建私有服务

    NuGet的使用.部署.搭建私有服务 前言 什么是NuGet? 为什么要使用NuGet NuGet的优点 使用 Get-Help NuGet Install-Package Get-Package U ...

  2. _2Python_注释命名等基本操作

    注释:注解,解释 主要用于在代码中给代码标识出相关的文字提示(提高代码的可读性)或调试程序,方便别人阅读和自己日后修改. Python中注释分为两类.单行注释:单行注释以#号开头,在一行内,#号后面的 ...

  3. 小程序web-view组件

    不久前微信小程序发布了web-view组件,这个消息在各个圈里引起不小的涟漪.近期正好在做小程序的项目,便研究了一下这个让大家充满期待的组件.   1,web-view这个组件是什么鬼? 官网的介绍: ...

  4. .net 系列:事件和委托

    在.net 的世界里,离不开委托和事件,其实理解透了后很简单,总结了一下分为5步:   1)定义委托   public delegate void RevicedEventHandler(object ...

  5. jquery.uploadify+spring mvc实现上传图片

    一.前端页面 1.下载jquery.uploadify 去uploadify官网(http://www.uploadify.com/download/)下载压缩包,解压后放在如下路径: 2.html结 ...

  6. 一些常用软件的静默安装参数(nsis,msi,InstallShield,Inno)

    打包的时候,经常需要安装一些其它的环境库,而又不想让用户繁锁的去选择,这时就需要静默安装,而不同的文件所加的参数了不一致,比如VS的环境库vcredist_x86.exe(这是32位的环境库)后面加/ ...

  7. C语言之计算log2

    #include<stdio.h>int main(){int num,count=0,i=0,ret=0;scanf("%d",&num);count=num ...

  8. 深入理解 Android 消息机制原理

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文讲述的是Android的消息机制原理,从Java到Native代码进行了梳理,并结合其中使用到的Epoll模型予以介 ...

  9. mongo安装,及远程连接

    yum 安装mongo创建镜像 1 vi /etc/yum.repos.d/mongodb-org-3.6.repo添加一下路径 保存退出[mongodb-org-3.6]name=MongoDB R ...

  10. 基于 HTML5 Canvas 的 3D 压力器反序列化

    在实际应用中,我觉得能够通过操作 JSON 文件来操作 3D 上的场景变化是非常方便的一件事,尤其是在做编辑器进行拖拽图元并且在图元上产生的一系列变化的时候,都能将数据很直观地反应给我们,这边我们简单 ...