iOS开发网络篇—XML介绍

xmldocument:适用于iOS的轻量级XML Document类 概述 SMXMLDocument是用于iOS的非常方便的轻量级XML解析器。 简单来说: // create a new SMXMLDocument with the contents of sample.xml SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error]; // Pull out the <books> node SMXMLElement *books = [document.root childNamed:@"books"]; // Look through <books> children of type <book> for (SMXMLElement *book in [books childrenNamed:@"book"]) { // demonstrate 立即下载

一、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


CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决) 本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。 阅读详情

相关推荐

Fluent DPM模型保姆级教程:三通管颗粒流动模拟,从网格导入到轨迹图生成

本文提供Fluent DPM模型在三通管颗粒流动模拟中的保姆级教程,涵盖从网格导入到轨迹图生成的全流程。通过详细步骤和参数设置,帮助用户掌握DPM模型在颗粒流动模拟中的关键技巧,适用于化工、能源等领域的工程应用。

weixin_30615767的博客 579

XML解析

非常详细的XML解析,转自:http://www.cnblogs.com/wendingding/p/3815497.html iOS开发网络篇—XML介绍 一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)

她。 763

Pipeline更多理解

Pipe 类型用途VIGVideo Image Generator:用于图层显示,支持 scaling、rotationRGB简单图层显示,较低优先级DMA主要用于 writeback / WFD / composition output,即从 framebuffer 输出到外部设备(或 memory)Cursor小图层,用于显示指针等很可能是:分别用于主屏、仪表、虚拟显示的输出路径或者用于不同的 display 去做 GPU_TARGET / writeback 的拷贝你看到的意思。

Damon_X的博客 1053

TOUCHXML解析xml

直奔主题。-》》》》》》》》》》》》》》 既然要使用touchXml解析xml。那么首先应该下载touchxml类库。猛击我。点击左边的zip下载。 打开下载好的类库。找到里面的Source文件夹。这就是需要用到的类库。 然后在xcode建立一个项目。在项目中新建一个文件夹,名字随便,就叫touchxml吧。然后将Source中的文件 拖入touchxml文件夹中。尽量将Copy it...

weixin_30527323的博客 145

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 741

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

由式(4-11)可知,蒙特卡洛模拟法的计算量不受电力系统规模大小影响,因此该方法在一些复杂的电力系统中可以得到应用,包括处理电力系统中有多个间歇性新能源接入的问题,解决系统中多个节点之间相关性问题等等。本章在此基础上提出了基于拟蒙特卡洛模拟的随机潮流计算方法,并且对拟蒙特卡洛法中的拟随机数序列进行了改进,大大提高了随机潮流的计算效率。模拟法的具体思路如下:基于实际工程问题的求解需要,建立与之相对应的随机模拟过程和随机概率模型,使得它们的参数,包括概率分布或者数学期望,能够等于问题的实际解;

weixin_47365903的博客 1797

苹果CMS V10 后台一键采集豆瓣API获取资料(最新版)

苹果CMS(V10最新版)后台更换一键采集豆瓣资料API接口的方法。

daicuocom的博客 7128

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1216

苹果CMS资源站采集API接口参数

恐怖片</type><pic>http://1img.joykk.com/Uploads/2009/11/30/20091130205750222.JPG</pic><lang>英语</lang><area>欧美</area><year>2012</year><state>0</state><note><![CDATA[流浪地球]]></name><type>恐怖片qvod

m0_65153447的博客 6385

端侧 AI 落地避坑指南(中):为什么 QAT 救不了精度?——对齐“融合后算子“的硬件物理约束

在上一篇文章中,我们深入探讨了量化的本质,并得出结论:QAT(量化感知训练)是保持精度的关键。明明做了 QAT,精度还是崩塌了!让我们看一个真实的案例:✅ 使用了✅ 配置了量化✅ 训练了 50 个 epoch,学习率降为原来的 1/10✅ 冻结了 BN 统计量FP32 模型:mAP = 0.85QAT 后 FP32:mAP = 0.84(正常)工具量化后:mAP = 0.68(崩塌!问题出在哪里?层融合(Layer Fusion)机制。

weixin_51988935的博客 55

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1215

苹果cms采集非html的视频,影视站采集MacCms10教程程

OK资源【修复采集别名,新接口】新接口要采集别名请修改成这个接口OK资源综合地址(别名):https://cj.okzy.tv/inc/api1s_subname.phpOK资源ckm3u8地址(别名):https://cj.okzy.tv/inc/apickm3u8s_subname.phpOK资源kuyun地址(别名):https://cj.okzy.tv/inc/apikuyuns_subn...

weixin_39949894的博客 2757

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IOS开发网络篇—XML介绍

iOS开发网络篇—XML介绍 一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document) XML举例 <videos> <video name="小黄人 第01部" length="30" /> ...

weixin_30731287的博客 132

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS开源代码 —— 非UI

<!-- .title {font-size:20px; padding-top:10px} .title a {text-decoration:none; color:rgb(187,68,17)} .detail {font-size:14px; line-height:25px; margin-top:-15px; padding-bottom:5px}

complex_ok的专栏 3283

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS开发笔记 - 网络篇

对iOS应用开发中应用程序如何通过网络获取资源进行了详细的阐述。

骆昊的技术专栏 8460

iOS网络编程开发—JSON解析与XML解析

一、什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)   JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号   要想从JS

Jason 的博客 4976

iOS开发网络篇—XML数据的解析

iOS开发网络篇—XML介绍 一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)   XML举例             二、XML的语法 1.简单

FLY的专栏 1692

IOS网络篇:JSON和XML的解析

什么是JSON ? 一:JSON是一种轻量级的数据交换格式,作用于数据交互,目前80%的开发都使用JSON格式,原因是它体积小,解析方便相比XML就很明显了 二:  从服务器返回给客户端的数据一般是JSON或XML格式(文件下载除外) 三:  JSON的格式很像OC中的字典 A: {"name":"剑圣","area":@"广东7","lv":"70"} B: {"skill":["

hzdg360的博客 709

iOS开发------XML原生解析(NSXMLParser篇)

由于项目需要,最近就研究了一些与视频流相关的知识,在学习的过程中发现,JSON作为轻量级的数据传输格式就显的非常不便.当然,这句话的意思就是说在学习过程中碰到的XML格式数据居多了呗,这时掌握一些XML的解析方法就显得重要了。尽管之前转发过一篇介绍XML解析的博文网络数据的XML解析,但总觉得千转不如一写,所以就花时间研究了一下。很多第三方代码其实能够很好的帮助我们解析数据,但由于楼主的个性,在认可

RITL_Y 5465

IOS学习之十六:网络数据的XML解析

网络应用中的数据解析,因为最近的应用,无论是Android的和ios平台的,一直用也是建议用的都是Json解析, xml解析都有点被遗忘了。 然后最近自己在做着玩一个ios的小应用,涉及网络数据的抓取,一些网站可能都提供了自己api平台,这些一般都是支持 我们对于数据协议格式的设定的。但是后来我在找寻到一些Rss资源时,发现返回的数据都是xml格式的, 因此,那就只好用xml解析了。

killnono 7万+

玩转iOS开发 - JSON 和 Xml 数据解析

前言Json 和xml是网络开发中常用的数据格式,JSON轻量级,xml相对较复杂,所以现在用JSON的比例非常大,基本上从服务器获取的返回数据都是JSON格式的,作为iOS开发者,解析JSON, XML文件是网络开发最基本的一步,不扯蛋了,直接进入正题。JSON解析JSON介绍 JSON 本质上,就是一个”特殊格式”的字符串JSON 是网络上用来传输数据使用最广泛的数据格式,没有之一 JSON

Focus Now 6032

iOS开发之网络通信(1)—— 计算机网络

目录1. 概念2. 分类2.1局域网2.2 城域网2.3 广域网2.4 无线网3. 各种网: 互联网 因特网 以太网 万维网4. 网络模型5. 协议5.1 HTTP(S)5.2 TCP5.3 UDP5.4 TCP与UDP差别5.5 IP6. 其他6.1 ISP6.2 端口引用 1. 概念 网, 本义指一种用绳线编织成的捕鱼工具. 后来引申指像网一样的东西, 又引申指像网一样纵横交错的系统或组织. 计算机网络, 也称计算机通信网, 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连.

看影成痴 1305
上一篇: iOS开发网络篇—JSON介绍
下一篇: Core Data 使用
韩小城
博客等级 码龄12年 37粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值