iOS開發網絡篇—XML介紹

一、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
複製代碼

打印查看

(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
複製代碼

注意:注意刷新代碼的操作,在進行解析的時候,需要對標籤進行判斷。

四、基於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
複製代碼

封裝的解析類的頭文件

複製代碼
 1 //
 2 //  YYtool.h
 3 //  01-文頂頂客戶端
 4 //
 5 //  Created by apple on 14-6-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @interface YYtool : NSObject
12 -(NSArray *)parseXMLData:(NSData *)data;
13 -(NSArray *)parseJSONData:(NSData *)data;
14 
15 @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
複製代碼

五、GDataXML

1.配置

GDataXML基於libxml2庫,得做以下配置

導入libxml2庫

該動態庫內部沒有頭文件,所以還需要設置libxml2的頭文件搜索路徑(爲了能找到libxml2庫的所有頭文件)

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

 

該庫是2008年的,未使用ARC進行內存管理,所以還需要告訴編譯器,對它進行非ARC處理。(Xcode6.0以上不需要操作此步了)

設置鏈接參數(自動鏈接libxml2庫)

Other Linker Flags中加入-lxml2(Xcode6.0以上不需要操作此步了)

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
複製代碼

執行:


原文轉之:http://www.cnblogs.com/wendingding/p/3815497.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章