IT虾米网

NSXMLParser 解析xml详解

lxf 2018年06月24日 手机开发 342 0
#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); 
} 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

UICollectionView 的使用详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。