iOS網路開發教程之XML解析,ios教程xml解析

來源:互聯網
上載者:User

iOS網路開發教程之XML解析,ios教程xml解析

XML簡介

什麼是XML?

全稱是 ExtensibleMarkupLanguage. 可延伸標記語言 (XML).

跟JSON一樣,也是常用的一種用於互動的資料格式

一般也叫做XML文檔 ( XML Document )

XML舉例 
XML文法:

一個常見的XML文檔一般由以下部分組成

文檔聲明

元素 ( Element )

一個元素包括了開始標籤和結束標籤擁有內容的元素:<video>小黃人</video>沒有內容的元素:<video>&nbsp;</video>沒有內容的元素簡寫:<video>一個元素可以嵌套若干個子項目(不能出現交叉嵌套) <videos><video><name>小黃人 第01部</name> <length>30</length></video></videos> 規範的XML文檔最多隻有1個根項目,其他元素都是根項目的子孫元素</video>

屬性 ( Attribute )

<video length="30" name="小黃人 第01部">video元素擁有name和length兩個屬性 屬性值必須用 雙引號&quot;&quot; 或者 單引號&#39;&#39; 括住 實際上,屬性工作表示的資訊也可以用子項目來表示,比如<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       

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.