• iOS网络编程开发—JSON和XML数据解析


    iOS网络编程开发—JSON解析

    一、什么是JSON

    JSON是一种轻量级的数据格式,一般用于数据交互

    服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)

    JSON的格式很像OC中的字典和数组

    {"name" : "jack", "age" : 10}

    {"names" : ["jack", "rose", "jim"]}

    标准JSON格式的注意点:key必须用双引号

    要想从JSON中挖掘出具体数据,得对JSON进行解析。即把JSON 转换为 OC数据类型

    二、JSON – OC 转换对照表

    对照关系

    三、JSON解析方案

    1.在iOS中,JSON的常见解析方案有4种

    (1)第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差) 

    (2)苹果原生(自带):NSJSONSerialization(性能最好)

    2.NSJSONSerialization的常见方法

    (1)JSON数据 ——》 OC对象

    + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

    (2)OC对象 ——》 JSON数据 

    + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

    3.解析来自服务器的JSON示意图

    四、部分代码示例

     1 #import "YYViewController.h"
     2 #import "MBProgressHUD+MJ.h"
     3 
     4 @interface YYViewController ()
     5 @property (weak, nonatomic) IBOutlet UITextField *username;
     6 @property (weak, nonatomic) IBOutlet UITextField *pwd;
     7 - (IBAction)login;
     8 
     9 @end
    10 
    11 @implementation YYViewController
    12 
    13 - (IBAction)login {
    14 //    1.提前的表单验证
    15     if (self.username.text.length==0) {
    16         [MBProgressHUD showError:@"请输入用户名"];
    17         return;
    18     }
    19     if (self.pwd.text.length==0) {
    20         [MBProgressHUD showError:@"请输入密码"];
    21         return;
    22     }
    23 //    2.发送请求给服务器(带上账号和密码)
    24     //添加一个遮罩,禁止用户操作
    25     [MBProgressHUD showMessage:@"正在努力加载中...."];
    26 
    27 //
    28 //    1.设置请求路径
    29 //    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    30 //    NSURL *url=[NSURL URLWithString:urlStr];
    31     
    32     // 1.设置请求路径
    33     NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"];//不需要传递参数
    34     
    35 //    2.创建请求对象
    36     NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];//默认为get请求
    37     request.timeoutInterval=5.0;//设置请求超时为5秒
    38     request.HTTPMethod=@"POST";//设置请求方法
    39     
    40     //设置请求体
    41     NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text];
    42     //把拼接后的字符串转换为data,设置请求体
    43     request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];
    44     
    45     //客户端类型,只能写英文
    46     [request setValue:@"ios+android" forHTTPHeaderField:@"User-Agent"];
    47     
    48 //    3.发送请求
    49     //获取一个主队列
    50     NSOperationQueue *queue=[NSOperationQueue mainQueue];
    51     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    52         //当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
    53         [MBProgressHUD hideHUD];
    54         if (data) {//请求成功
    55             NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    56             //判断后,在界面提示登录信息
    57             NSString *error=dict[@"error"];
    58             if (error) {
    59                 [MBProgressHUD showError:error];
    60             }else
    61             {
    62                 NSString *success=dict[@"success"];
    63                 [MBProgressHUD showSuccess:success];
    64             }
    65         }else   //请求失败
    66         {
    67             [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
    68         }
    69     }];
    70     NSLog(@"请求发送完毕");
    71 }
    72 @end
    View Code

     

    五、XML简单介绍

    XML:全称是Extensible Markup Language,译作“可扩展标记语言”

    跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)

    XML举例

    <videos>

        <video name="小黄人 第01部" length="30" />

        <video name="小黄人 第02部" length="19" />

        <video name="小黄人 第03部" length="33" />

    </videos>

    六、XML的语法

    1.简单说明

    一个常见的XML文档一般由以下部分组成

    文档声明

    元素(Element)

    属性(Attribute)

    2.文档声明

    在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型

    最简单的声明

    <?xml version="1.0" ?>

    用encoding属性说明文档的字符编码

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

    3.XML语法 – 元素(Element)

    一个元素包括了开始标签和结束标签

    拥有元素内容:<video>小黄人</video>

    没有元素内容:<video></video>

    没有元素内容的简写:<video/> 

    一个元素可以嵌套若干个子元素(不能出现交叉嵌套)

    <videos>

        <video>

            <name>小黄人 第01部</name>

             <length>30</length>

        </video>

    </videos>

    注意:

    (1)规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素

    (2)XML中的所有空格和换行,都会当做具体内容处理

    下面两个元素的内容是不一样的

    第1个

    <video>小黄人</video>

    第2个

    <video>

        小黄人

    </video>

    4.XML语法 – 属性(Attribute)

    一个元素可以拥有多个属性

    <video name="小黄人 第01部" length="30" />            ====》video元素拥有name和length两个属性

    注意:属性值必须用 双引号"" 或者 单引号'' 括住

    实际上,属性表示的信息也可以用子元素来表示,比如

    <video>

        <name>小黄人 第01部</name>

            <length>30</length>

    </video>

    三、XML的解析

    1.简单说明

    要想从XML中提取有用的信息,必须得学会解析XML

    提取name元素里面的内容

    <name>小黄人 第01部</name>

    提取video元素中name和length属性的值

    <video name="小黄人 第01部" length="30" />

    XML的解析方式有2种

    (1)DOM:一次性将整个XML文档加载进内存,比较适合解析小文件

    (3)SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

    2.IOS开发中XML的解析

    在iOS中,解析XML的手段有很多

    (1)苹果原生   NSXMLParser:SAX方式解析,使用简单

    (2)第三方框架

    1)libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

    2)GDataXML:DOM方式解析,由Google开发,基于libxml2

    XML解析方式的选择建议:

    大文件:NSXMLParser、libxml2

    小文件:GDataXML

    3.NSXMLParser

    (1)使用步骤

    // 1.传入XML数据,创建解析器

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 2.设置代理,监听解析过程

    parser.delegate = self;

    // 3.开始解析

    [parser parse];

    (2)说明

    NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理

    当扫描到文档(Document)的开始与结束

    当扫描到元素(Element)的开始与结束

    (3)NSXMLParserDelegate

    1)当扫描到文档的开始时调用(开始解析)- (void)parserDidStartDocument:(NSXMLParser *)parser 

    2)当扫描到文档的结束时调用(解析完毕)- (void)parserDidEndDocument:(NSXMLParser *)parser

    3)当扫描到元素的开始时调用(attributeDict存放着元素的属性)- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 

    4)当扫描到元素的结束时调用  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

    (4)代码示例

      1 //
      2 //  YYViewController.m
      3 //  01-文顶顶客户端
      4 //
      5 //  Created by apple on 14-6-29.
      6 //  Copyright (c) 2014年 itcase. All rights reserved.
      7 //
      8 
      9 #import "YYViewController.h"
     10 #import "MBProgressHUD+MJ.h"
     11 #import "YYviodesModel.h"
     12 #import "YYCell.h"
     13 #import <MediaPlayer/MediaPlayer.h>
     14 #import "YYMoviePlayerViewController.h"
     15 
     16 @interface YYViewController ()<NSXMLParserDelegate>
     17 @property(nonatomic,strong)NSArray *videos;
     18 
     19 @end
     20 
     21 @implementation YYViewController
     22 
     23 - (void)viewDidLoad
     24 {
     25     [super viewDidLoad];
     26     //去掉下划线
     27     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
     28     
     29     [MBProgressHUD showMessage:@"正在努力加载中"];
     30     
     31     //创建路径
     32 
     33     NSString  *urlStr=@"http://192.168.1.53:8080/MJServer/video?type=XML";
     34     NSURL *url=[NSURL URLWithString:urlStr];
     35     
     36     //创建请求
     37     NSMutableURLRequest  *request=[NSMutableURLRequest requestWithURL:url];//默认为get请求
     38     //设置最大的网络等待时间
     39     request.timeoutInterval=20.0;
     40     
     41     //获取主队列
     42     NSOperationQueue *queue=[NSOperationQueue mainQueue];
     43     //发起请求
     44    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     45        //隐藏HUD
     46         [MBProgressHUD hideHUD];
     47        if (data) {//如果请求成功,拿到服务器返回的数据
     48            [self parseXMLData:data];
     49            
     50 //           //解析拿到的数据(JSON方式)
     51 //           NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
     52 ////           NSArray *array=dict[@"video"];
     53 //           NSArray *array=dict[@"videos"];
     54 //           
     55 //           NSMutableArray *videos=[NSMutableArray array];
     56 //           for (NSDictionary *dict in array) {
     57 //               YYviodesModel *model=[YYviodesModel viodesModelWithDict:dict];
     58 //               [videos addObject:model];
     59 //           }
     60 //           self.videos=videos;
     61            
     62            //刷新表格
     63            [self.tableView reloadData];
     64            
     65        }else//如果请求失败,没有拿到数据
     66        {
     67            [MBProgressHUD showError:@"网络繁忙,等稍后再试!"];
     68        }
     69    }];
     70 }
     71 
     72 /**
     73  *  解析XML数据
     74  */
     75 -(void)parseXMLData:(NSData *)data
     76 {
     77     //1.创建解析器
     78     NSXMLParser *parser=[[NSXMLParser alloc]initWithData:data];
     79     //2.设置代理
     80     parser.delegate=self;
     81     
     82     //3.开始解析
     83     [parser parse];
     84 }
     85 
     86 #pragma mark-NSXMLParserDelegate
     87 /**
     88  *开始解析文档时调用
     89  */
     90 -(void)parserDidStartDocument:(NSXMLParser *)parser
     91 {
     92     NSLog(@"开始解析文档");
     93 }
     94 /**
     95  *结束解析文档时调用(解析完毕)
     96  */
     97 -(void)parserDidEndDocument:(NSXMLParser *)parser
     98 {
     99     NSLog(@"结束解析文档");
    100 }
    101 /**
    102  *解析到一个元素的开头时调用
    103  */
    104 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    105 {
    106     NSLog(@"解析到一个元素的开头---%@",elementName);
    107 }
    108 /**
    109  *解析到一个元素的结尾时调用
    110  */
    111 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    112 {
    113     NSLog(@"解析到一个元素的结尾---%@",elementName);
    114 }
    115 #pragma mark-数据源方法
    116 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    117 {
    118     return 1;
    119 }
    120 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    121 {
    122     return self.videos.count;
    123 }
    124 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    125 {
    126     YYCell *cell=[YYCell cellWithTableView:tableView];
    127     //获取数据模型
    128     cell.model=self.videos[indexPath.row];
    129     return cell;
    130 }
    131 
    132 //设置cell的行高
    133 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    134 {
    135     return 70;
    136 }
    137 
    138 //播放视频
    139 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    140 {
    141     //取出数据模型
    142     YYviodesModel *model=self.videos[indexPath.row];
    143     
    144     //创建视屏播放器
    145  //   MPMoviePlayerController 可以随意控制播放器的尺寸
    146     //MPMoviePlayerViewController只能全屏播放
    147     
    148         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
    149     NSURL *videoUrl=[NSURL URLWithString:url];
    150     YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];
    151     //弹出播放器
    152     [self presentMoviePlayerViewControllerAnimated:movieVc];
    153 //    UIApplicationDidEnterBackgroundNotification
    154 }
    155 
    156 
    157 @end
    View Code

    打印查看

    (5)完成完整的功能

      1 //
      2 //  YYViewController.m
      3 //  01-文顶顶客户端
      4 //
      5 //  Created by apple on 14-6-29.
      6 //  Copyright (c) 2014年 itcase. All rights reserved.
      7 //
      8 
      9 #import "YYViewController.h"
     10 #import "MBProgressHUD+MJ.h"
     11 #import "YYviodesModel.h"
     12 #import "YYCell.h"
     13 #import <MediaPlayer/MediaPlayer.h>
     14 #import "YYMoviePlayerViewController.h"
     15 
     16 @interface YYViewController ()<NSXMLParserDelegate>
     17 @property(nonatomic,strong)NSMutableArray *videos;
     18 
     19 @end
     20 
     21 @implementation YYViewController
     22 
     23 - (void)viewDidLoad
     24 {
     25     [super viewDidLoad];
     26     //去掉下划线
     27     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
     28     
     29     [MBProgressHUD showMessage:@"正在努力加载中"];
     30     
     31     //创建路径
     32 
     33     NSString  *urlStr=@"http://192.168.1.53:8080/MJServer/video?type=XML";
     34     NSURL *url=[NSURL URLWithString:urlStr];
     35     
     36     //创建请求
     37     NSMutableURLRequest  *request=[NSMutableURLRequest requestWithURL:url];//默认为get请求
     38     //设置最大的网络等待时间
     39     request.timeoutInterval=20.0;
     40     
     41     //获取主队列
     42     NSOperationQueue *queue=[NSOperationQueue mainQueue];
     43     //发起请求
     44    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     45        //隐藏HUD
     46         [MBProgressHUD hideHUD];
     47        if (data) {//如果请求成功,拿到服务器返回的数据
     48            //解析XML数据
     49            [self parseXMLData:data];
     50        }else//如果请求失败,没有拿到数据
     51        {
     52            [MBProgressHUD showError:@"网络繁忙,等稍后再试!"];
     53        }
     54    }];
     55 }
     56 
     57 /**
     58  *  解析XML数据
     59  */
     60 -(void)parseXMLData:(NSData *)data
     61 {
     62     //1.创建解析器
     63     NSXMLParser *parser=[[NSXMLParser alloc]initWithData:data];
     64     //2.设置代理
     65     parser.delegate=self;
     66     
     67     //3.开始解析
     68     [parser parse];  //这个方法会卡住(同步解析,解析完毕后才会返回)
     69     
     70     //4.刷新表格
     71     [self.tableView reloadData];
     72 }
     73 
     74 #pragma mark-NSXMLParserDelegate
     75 /**
     76  *开始解析文档时调用
     77  */
     78 -(void)parserDidStartDocument:(NSXMLParser *)parser
     79 {
     80     NSLog(@"开始解析文档");
     81 }
     82 /**
     83  *结束解析文档时调用(解析完毕)
     84  */
     85 -(void)parserDidEndDocument:(NSXMLParser *)parser
     86 {
     87     NSLog(@"结束解析文档");
     88     //也可以在这里刷新表格
     89 //    [self.tableView reloadData];
     90 }
     91 /**
     92  *解析到一个元素的开头时调用
     93  */
     94 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
     95 {
     96 //    NSLog(@"解析到一个元素的开头---%@",elementName);
     97     if ([@"videos" isEqualToString:elementName]) {//解析到一个videos标签
     98         self.videos=[NSMutableArray array];
     99     }else if ([@"video" isEqualToString:elementName])
    100     {//解析到一个video标签,创建一个模型
    101         YYviodesModel *model=[YYviodesModel viodesModelWithDict:attributeDict];
    102         [self.videos addObject:model];
    103     }
    104 }
    105 /**
    106  *解析到一个元素的结尾时调用
    107  */
    108 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    109 {
    110     NSLog(@"解析到一个元素的结尾---%@",elementName);
    111 }
    112 #pragma mark-数据源方法
    113 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    114 {
    115     return 1;
    116 }
    117 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    118 {
    119     return self.videos.count;
    120 }
    121 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    122 {
    123     YYCell *cell=[YYCell cellWithTableView:tableView];
    124     //获取数据模型
    125     cell.model=self.videos[indexPath.row];
    126     return cell;
    127 }
    128 
    129 //设置cell的行高
    130 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    131 {
    132     return 70;
    133 }
    134 
    135 //播放视频
    136 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    137 {
    138     //取出数据模型
    139     YYviodesModel *model=self.videos[indexPath.row];
    140     
    141     //创建视屏播放器
    142  //   MPMoviePlayerController 可以随意控制播放器的尺寸
    143     //MPMoviePlayerViewController只能全屏播放
    144     
    145         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
    146     NSURL *videoUrl=[NSURL URLWithString:url];
    147     YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];
    148     //弹出播放器
    149     [self presentMoviePlayerViewControllerAnimated:movieVc];
    150 //    UIApplicationDidEnterBackgroundNotification
    151 }
    152 
    153 
    154 @end
    View Code

    注意:注意刷新代码的操作,在进行解析的时候,需要对标签进行判断。

    四、基于NSXMLParser(SAX)封装解析数据的代码(包括JSON和XML的解析)

    封装后的主控制器代码:

      1 //
      2 //  YYViewController.m
      3 //  01-文顶顶客户端
      4 //
      5 //  Created by apple on 14-6-29.
      6 //  Copyright (c) 2014年 itcase. All rights reserved.
      7 //
      8 
      9 #import "YYViewController.h"
     10 #import "MBProgressHUD+MJ.h"
     11 #import "YYviodesModel.h"
     12 #import "YYCell.h"
     13 #import <MediaPlayer/MediaPlayer.h>
     14 #import "YYMoviePlayerViewController.h"
     15 #import "YYtool.h"
     16 
     17 @interface YYViewController ()
     18 @property(nonatomic,strong)NSArray *videos;
     19 @end
     20 
     21 @implementation YYViewController
     22 
     23 -(NSArray *)videos
     24 {
     25     if (_videos==nil) {
     26         _videos=[NSArray array];
     27     }
     28     return _videos;
     29 }
     30 - (void)viewDidLoad
     31 {
     32     [super viewDidLoad];
     33     //去掉下划线
     34     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
     35     
     36     [MBProgressHUD showMessage:@"正在努力加载中"];
     37     
     38     //创建路径
     39 
     40     NSString  *urlStr=@"http://192.168.1.53:8080/MJServer/video?type=JSON";
     41     NSURL *url=[NSURL URLWithString:urlStr];
     42     
     43     //创建请求
     44     NSMutableURLRequest  *request=[NSMutableURLRequest requestWithURL:url];//默认为get请求
     45     //设置最大的网络等待时间
     46     request.timeoutInterval=20.0;
     47     
     48     //获取主队列
     49     NSOperationQueue *queue=[NSOperationQueue mainQueue];
     50     //发起请求
     51    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     52        //隐藏HUD
     53         [MBProgressHUD hideHUD];
     54        if (data) {//如果请求成功,拿到服务器返回的数据
     55            //解析XML数据
     56            YYtool *tool=[[YYtool alloc]init];
     57 //           [tool parseXMLData:data];
     58            self.videos=[tool parseJSONData:data];
     59            //刷新表格
     60            [self.tableView reloadData];
     61        }else//如果请求失败,没有拿到数据
     62        {
     63            [MBProgressHUD showError:@"网络繁忙,等稍后再试!"];
     64        }
     65    }];
     66 }
     67 
     68 
     69 #pragma mark-数据源方法
     70 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     71 {
     72     return 1;
     73 }
     74 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     75 {
     76     return self.videos.count;
     77 }
     78 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     79 {
     80     YYCell *cell=[YYCell cellWithTableView:tableView];
     81     //获取数据模型
     82     cell.model=self.videos[indexPath.row];
     83     return cell;
     84 }
     85 
     86 //设置cell的行高
     87 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     88 {
     89     return 70;
     90 }
     91 
     92 //播放视频
     93 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
     94 {
     95     //取出数据模型
     96     YYviodesModel *model=self.videos[indexPath.row];
     97     
     98     //创建视屏播放器
     99  //   MPMoviePlayerController 可以随意控制播放器的尺寸
    100     //MPMoviePlayerViewController只能全屏播放
    101     
    102         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
    103     NSURL *videoUrl=[NSURL URLWithString:url];
    104     YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];
    105     //弹出播放器
    106     [self presentMoviePlayerViewControllerAnimated:movieVc];
    107 //    UIApplicationDidEnterBackgroundNotification
    108 }
    109 @end
    View Code

    封装的解析类的头文件

    //
    //  YYtool.h
    //  01-文顶顶客户端
    //
    //  Created by apple on 14-6-29.
    //  Copyright (c) 2014年 itcase. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface YYtool : NSObject
    -(NSArray *)parseXMLData:(NSData *)data;
    -(NSArray *)parseJSONData:(NSData *)data;
    
    @end

    封装的解析类的内部实现:

     1 //
     2 //  YYtool.m
     3 //  01-文顶顶客户端
     4 //
     5 //  Created by apple on 14-6-29.
     6 //  Copyright (c) 2014年 itcase. All rights reserved.
     7 //
     8 
     9 #import "YYtool.h"
    10 #import "YYviodesModel.h"
    11 
    12 @interface YYtool ()<NSXMLParserDelegate>
    13 @property(nonatomic,strong)NSMutableArray *videos;
    14 @end
    15 @implementation YYtool
    16 
    17 -(NSArray *)parseJSONData:(NSData *)data
    18 {
    19     NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    20     //           NSArray *array=dict[@"video"];
    21     NSArray *array=dict[@"videos"];
    22     
    23     NSMutableArray *videos=[NSMutableArray array];
    24     for (NSDictionary *dict in array) {
    25         YYviodesModel *model=[YYviodesModel viodesModelWithDict:dict];
    26         [videos addObject:model];
    27     }
    28     return videos;
    29 }
    30 
    31 -(NSArray *)parseXMLData:(NSData *)data
    32 {
    33     //1.创建解析器
    34     NSXMLParser *parser=[[NSXMLParser alloc]initWithData:data];
    35     //2.设置代理
    36     parser.delegate=self;
    37     
    38     //3.开始解析
    39     [parser parse];  //这个方法会卡住(同步解析,解析完毕后才会返回)
    40     
    41     return self.videos;
    42 }
    43 
    44 #pragma mark-NSXMLParserDelegate
    45 /**
    46  *开始解析文档时调用
    47  */
    48 -(void)parserDidStartDocument:(NSXMLParser *)parser
    49 {
    50     NSLog(@"开始解析文档");
    51 }
    52 /**
    53  *结束解析文档时调用(解析完毕)
    54  */
    55 -(void)parserDidEndDocument:(NSXMLParser *)parser
    56 {
    57     NSLog(@"结束解析文档");
    58     //也可以在这里刷新表格
    59     //    [self.tableView reloadData];
    60 }
    61 /**
    62  *解析到一个元素的开头时调用
    63  */
    64 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    65 {
    66     if ([@"videos" isEqualToString:elementName]) {//解析到一个videos标签
    67         self.videos=[NSMutableArray array];
    68     }else if ([@"video" isEqualToString:elementName])
    69     {//解析到一个video标签,创建一个模型
    70         YYviodesModel *model=[YYviodesModel viodesModelWithDict:attributeDict];
    71         [self.videos addObject:model];
    72     }
    73 }
    74 /**
    75  *解析到一个元素的结尾时调用
    76  */
    77 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    78 {
    79     NSLog(@"解析到一个元素的结尾---%@",elementName);
    80 }
    81 
    82 @end
    View Code

    五、GDataXML

    1.配置

    GDataXML基于libxml2库,得做以下配置

    导入libxml2库

    该动态库内部没有头文件,所以还需要设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)

    Head Search Path中加入/usr/include/libxml2

     

    该库是2008年的,未使用ARC进行内存管理,所以还需要告诉编译器,对它进行非ARC处理。

    设置链接参数(自动链接libxml2库)

    Other Linker Flags中加入-lxml2

    2.GDataXML使用

    GDataXML中常用的类

    GDataXMLDocument:代表整个XML文档

    GDataXMLElement

    代表文档中的每个元素

    使用attributeForName:方法可以获得属性值

    代码示例:

      1 //
      2 //  YYViewController.m
      3 //  01-文顶顶客户端
      4 //
      5 //  Created by apple on 14-6-29.
      6 //  Copyright (c) 2014年 itcase. All rights reserved.
      7 //
      8 
      9 #import "YYViewController.h"
     10 #import "MBProgressHUD+MJ.h"
     11 #import "YYviodesModel.h"
     12 #import "YYCell.h"
     13 #import <MediaPlayer/MediaPlayer.h>
     14 #import "YYMoviePlayerViewController.h"
     15 #import "GDataXMLNode.h"
     16 
     17 @interface YYViewController ()<NSXMLParserDelegate>
     18 @property(nonatomic,strong)NSMutableArray *videos;
     19 
     20 @end
     21 
     22 @implementation YYViewController
     23 
     24 - (void)viewDidLoad
     25 {
     26     [super viewDidLoad];
     27     //去掉下划线
     28     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
     29     
     30     [MBProgressHUD showMessage:@"正在努力加载中"];
     31     
     32     //创建路径
     33 
     34     NSString  *urlStr=@"http://192.168.1.53:8080/MJServer/video?type=XML";
     35     NSURL *url=[NSURL URLWithString:urlStr];
     36     
     37     //创建请求
     38     NSMutableURLRequest  *request=[NSMutableURLRequest requestWithURL:url];//默认为get请求
     39     //设置最大的网络等待时间
     40     request.timeoutInterval=20.0;
     41     
     42     //获取主队列
     43     NSOperationQueue *queue=[NSOperationQueue mainQueue];
     44     //发起请求
     45    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     46        //隐藏HUD
     47         [MBProgressHUD hideHUD];
     48        if (data) {//如果请求成功,拿到服务器返回的数据
     49            //解析XML数据
     50            [self parseXMLData:data];
     51        }else//如果请求失败,没有拿到数据
     52        {
     53            [MBProgressHUD showError:@"网络繁忙,等稍后再试!"];
     54        }
     55    }];
     56 }
     57 
     58 /**
     59  *  DOM方式解析XML数据
     60  */
     61 -(void)parseXMLData:(NSData *)data
     62 {
     63     //1.加载文档
     64     GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
     65     //2.获得根元素
     66     GDataXMLElement *root=doc.rootElement;
     67     //3.获得所有的video元素
     68     NSArray *elements=[root elementsForName:@"video"];
     69     //4.将GDataXMLElement对象转换成模型
     70     NSMutableArray *videos=[NSMutableArray array];
     71     for (GDataXMLElement *ele in elements) {
     72         YYviodesModel *model=[[YYviodesModel alloc]init];
     73         model.ID=[ele attributeForName:@"id"].stringValue.intValue;
     74         model.length=[ele attributeForName:@"length"].stringValue.intValue;
     75         model.name=[ele attributeForName:@"name"].stringValue;
     76         model.image=[ele attributeForName:@"image"].stringValue;
     77         model.url=[ele attributeForName:@"url"].stringValue;
     78         [videos addObject:model];
     79     }
     80     self.videos=videos;
     81     //4.刷新表格
     82     [self.tableView reloadData];
     83 }
     84 
     85 #pragma mark-数据源方法
     86 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     87 {
     88     return 1;
     89 }
     90 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     91 {
     92     return self.videos.count;
     93 }
     94 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     95 {
     96     YYCell *cell=[YYCell cellWithTableView:tableView];
     97     //获取数据模型
     98     cell.model=self.videos[indexPath.row];
     99     return cell;
    100 }
    101 
    102 //设置cell的行高
    103 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    104 {
    105     return 70;
    106 }
    107 
    108 //播放视频
    109 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    110 {
    111     //取出数据模型
    112     YYviodesModel *model=self.videos[indexPath.row];
    113     
    114     //创建视屏播放器
    115  //   MPMoviePlayerController 可以随意控制播放器的尺寸
    116     //MPMoviePlayerViewController只能全屏播放
    117     
    118         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];
    119     NSURL *videoUrl=[NSURL URLWithString:url];
    120     YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];
    121     //弹出播放器
    122     [self presentMoviePlayerViewControllerAnimated:movieVc];
    123 //    UIApplicationDidEnterBackgroundNotification
    124 }
    125 @end
    View Code

    执行:

     
     
  • 相关阅读:
    Hash索引和B树索引
    同步,异步,阻塞,非阻塞
    程序指令的异常跳转setjmp, longjmp和异常
    detangle c++ symbols
    RAID-4与模2和
    return, exit, _exit的区别
    metaprogramming笔记
    C++中的数组与指针
    LeetCode-3. Longest Substring Without Repeating Characters
    LeetCode-1. Two Sum
  • 原文地址:https://www.cnblogs.com/asd5551680/p/4165380.html
Copyright © 2020-2023  润新知