NSXMLParser 解析xml詳解

jopen 9年前發布 | 1K 次閱讀 Objective-C IOS

#import "ViewController.h"

import "Video.h"

@interface ViewController ()<NSXMLParserDelegate> //存儲對象數組 @property (nonatomic, strong) NSMutableArray videos; // 來回拼接 @property (nonatomic, strong) NSMutableString elementString; // 當前視頻信息的對象 @property (nonatomic, strong) Video *video; @end

@implementation ViewController

  • (void)viewDidLoad { [super viewDidLoad];

    // 加載數據方法 [self loadData]; }

pragma mark - 加載數據

  • (void)loadData { // data NSString path = [[NSBundle mainBundle] pathForResource:@"video.xml" ofType:nil]; NSData data = [NSData dataWithContentsOfFile:path];

    // 1>創建,傳遞data NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 2> 設置代理 parser.delegate = self;

    // 3> 開始解析 [parser parse];//返回值,判斷是否解析成功

    // 4> 解析完成之后的操作 }

pragma mark - XML解析代理方法

pragma mark 1. 開始

  • (void)parserDidStartDocument:(NSXMLParser *)parser { // NSLog(@"開始解析文檔"); // 準備工作 // 1> dataList self.videos = [NSMutableArray array];

    // 2> elementString self.elementString = [NSMutableString string]; }

pragma mark 2. 所有開始一個節點:<element>

  • (void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict { NSLog(@"開始節點:=====%@ %@", elementName, attributeDict); // 如果是<video>新建對象 if ([elementName isEqualToString:@"video"]) {

      self.video = [[Video alloc] init];
    

    }

    // 每開始一個新節點之前都清空elementString // 避免上一次的結果被重復拼接,例如拼完名字是"abc",再拼長度就會變成"vda1234" [self.elementString setString:@""]; }

pragma mark 3. 查找內容,可能會重復多次

  • (void)parser:(NSXMLParser )parser foundCharacters:(NSString )string { // 拼接字符串 [self.elementString appendString:string]; }

pragma mark 4. 節點結束 </element>

  • (void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName { // NSLog(@"結束節點 %@", elementName); if ([elementName isEqualToString:@"name"]) {
      self.video.name = self.elementString;
    
    } else if ([elementName isEqualToString:@"length"]) {
      self.video.length = self.elementString;
    
    } //將對象添加到數組 else if([elementName isEqualToString:@"video"]) {
      [self.videos addObject:self.video];
    
    }

}

pragma mark 5. 文檔結束

  • (void)parserDidEndDocument:(NSXMLParser )parser { for (Video video in self.videos) {
       NSLog(@"%@---%@", video.name, video.length);
    
    } }

pragma mark 6. 出錯處理

  • (void)parser:(NSXMLParser )parser parseErrorOccurred:(NSError )parseError { NSLog(@"%@", parseError.localizedDescription); } </pre>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!