iOS網路開發教程之XML解析,ios教程xml解析
XML簡介
什麼是XML?
全稱是 ExtensibleMarkupLanguage. 可延伸標記語言 (XML).
跟JSON一樣,也是常用的一種用於互動的資料格式
一般也叫做XML文檔 ( XML Document )
XML舉例
XML文法:
一個常見的XML文檔一般由以下部分組成
文檔聲明
元素 ( Element )
一個元素包括了開始標籤和結束標籤擁有內容的元素:<video>小黃人</video>沒有內容的元素:<video> </video>沒有內容的元素簡寫:<video>一個元素可以嵌套若干個子項目(不能出現交叉嵌套) <videos><video><name>小黃人 第01部</name> <length>30</length></video></videos> 規範的XML文檔最多隻有1個根項目,其他元素都是根項目的子孫元素</video>
屬性 ( Attribute )
<video length="30" name="小黃人 第01部">video元素擁有name和length兩個屬性 屬性值必須用 雙引號"" 或者 單引號'' 括住 實際上,屬性工作表示的資訊也可以用子項目來表示,比如<video><name>小黃人 第01部</name> <length>30</length></video></video>
XML解析
XML的解析方式有2種
DOM: 一次性將整個XML文檔載入進記憶體,比較適合
解析小檔案SAX: 從根項目開始,按順序一個元素一個元素往下解析,比較適合
解析大檔案
SAX解析:( NSXMLParser )
#import "ViewController.h"#import "UIImageView+WebCache.h"#import #import "ZYVideo.h"#import "MJExtension.h"#define baseUrlStr @"https://120.25.226.186:32812"@interface ViewController ()/* 儲存模型的 數組 */@property (nonatomic, strong) NSMutableArray *videos;@end@implementation ViewController- (NSMutableArray *)videos{ if (!_videos) { _videos = [NSMutableArray array]; } return _videos;}- (void)viewDidLoad { [super viewDidLoad]; // 替換 模型中屬性的名稱 和 系統關鍵字衝突.(系統內建方法衝突) [ZYVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{ return @{ @"ID" : @"id" }; }]; //1. 確定url NSURL *url = [NSURL URLWithString:@"https://localhost:8080/MJServer/video?method=get&type=XML"]; //2. 建立請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3. 建立非同步串連 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 容錯處理 if (connectionError) { return ; } // 4. 解析資料(還原序列化) NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; // 開始解析: parse方法是 阻塞的, 只有把解析完,才會 調用reloadData [parser parse]; //5. 重新整理UI [self.tableView reloadData]; }];}#pragma -mark NSXMLParser代理方法// 開始解析- (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"開始解析----");}// 開始解析某個元素- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{// NSLog(@"%@---%@",elementName,attributeDict); // SAX解析, 一個一個節點 解析 if ([elementName isEqualToString:@"videos"]) { return; } // 字典轉模型 [self.videos addObject:[ZYVideo mj_objectWithKeyValues:attributeDict]]; }// 某個元素解析完畢- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"%@",elementName);}// 結束解析- (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"結束解析----");}#pragma -mark tableView資料來源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.videos.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //1. 設定重用標識 static NSString *ID = @"video"; //2. 在緩衝池中複用cell(如果沒有會自動建立) UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //3. 設定資料// NSDictionary *dict = self.videos[indexPath.row]; ZYVideo *video = self.videos[indexPath.row]; cell.textLabel.text = video.name; cell.detailTextLabel.text = [NSString stringWithFormat:@"播放時間:%@",video.length]; // 使用SDWebImage設定網路中下載的圖片 // 拼接圖片的url// NSString *baseUrlStr = @"https://120.25.226.186:32812"; NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.image]; [cell.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:[UIImage imageNamed:@"qq"]]; // NSLog(@"----%@",video.ID); return cell; }#pragma -mark tableView的代理方法- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //1. 拿到資料// NSDictionary *dict = self.videos[indexPath.row]; ZYVideo *video = self.videos[indexPath.row]; //2. 拼接資源路徑 NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.url]; //3. 建立播放器 MPMoviePlayerViewController *mpc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:urlStr]]; //4. 彈出控制器 [self presentViewController:mpc animated:YES completion:nil];}@end
DOM解析:(GDataXMLDocument)
使用DOM解析前的配置工作:
1. 匯入 GDataXML檔案.
#import "ViewController.h"#import "UIImageView+WebCache.h"#import #import "ZYVideo.h"#import "MJExtension.h"#import "GDataXMLNode.h"#define baseUrlStr @"https://120.25.226.186:32812"@interface ViewController ()/* 儲存模型的 數組 */@property (nonatomic, strong) NSMutableArray *videos;@end@implementation ViewController- (NSMutableArray *)videos{ if (!_videos) { _videos = [NSMutableArray array]; } return _videos;}- (void)viewDidLoad { [super viewDidLoad]; // 替換 模型中屬性的名稱 和 系統關鍵字衝突.(系統內建方法衝突) [ZYVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{ return @{ @"ID" : @"id" }; }]; //1. 確定url NSURL *url = [NSURL URLWithString:@"https://localhost:8080/MJServer/video?method=get&type=XML"]; //2. 建立請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3. 建立非同步串連 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 容錯處理 if (connectionError) { return ; } // 4. 解析資料(還原序列化) // 4.1 載入整個XML文檔 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:kNilOptions error:nil]; //4.2 XML文檔的根項目. 拿到根項目內部的 所有名稱為video的子孫元素 NSArray *eles = [doc.rootElement elementsForName:@"video"]; //4.3 遍曆操作 for (GDataXMLElement *ele in eles) { // 拿到子項目中的屬性 ---> 模型 ---> 添加到self.videos ZYVideo *video = [[ZYVideo alloc] init]; video.name = [ele attributeForName:@"name"].stringValue; video.length = [ele attributeForName:@"length"].stringValue; video.image = [ele attributeForName:@"image"].stringValue; video.ID = [ele attributeForName:@"id"].stringValue; video.url = [ele attributeForName:@"url"].stringValue; [self.videos addObject:video]; } //5. 重新整理UI [self.tableView reloadData]; }];}#pragma -mark tableView資料來源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.videos.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //1. 設定重用標識 static NSString *ID = @"video"; //2. 在緩衝池中複用cell(如果沒有會自動建立) UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //3. 設定資料 // NSDictionary *dict = self.videos[indexPath.row]; ZYVideo *video = self.videos[indexPath.row]; cell.textLabel.text = video.name; cell.detailTextLabel.text = [NSString stringWithFormat:@"播放時間:%@",video.length]; // 使用SDWebImage設定網路中下載的圖片 // 拼接圖片的url // NSString *baseUrlStr = @"https://120.25.226.186:32812"; NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.image]; [cell.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:[UIImage imageNamed:@"qq"]]; // NSLog(@"----%@",video.ID); return cell; }#pragma -mark tableView的代理方法- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //1. 拿到資料 // NSDictionary *dict = self.videos[indexPath.row]; ZYVideo *video = self.videos[indexPath.row]; //2. 拼接資源路徑 NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.url]; //3. 建立播放器 MPMoviePlayerViewController *mpc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:urlStr]]; //4. 彈出控制器 [self presentViewController:mpc animated:YES completion:nil];}@end