1.用NSXMLParser解析XML(SAX方式解析,p从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件)
- 使用步骤
// 传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理,监听解析过程
parser.delegate = self;
// 开始解析
[parser parse]
- NSXMLParserDelegate
- (void)parserDidStartDocument:(NSXMLParser *)parser
- (void)parserDidEndDocument:(NSXMLParser *)parser
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
1 #import "ViewController.h" 2 #import "UIImageView+WebCache.h" 3 #import "XMGVideo.h" 4 #import "MJExtension.h" 5 6 #import <MediaPlayer/MediaPlayer.h> 7 @interface ViewController ()<NSXMLParserDelegate> 8 9 /*TableView的数据源*/ 10 @property (nonatomic, strong) NSMutableArray *videos; 11 @end 12 13 @implementation ViewController 14 15 -(NSMutableArray *)videos 16 { 17 if (_videos == nil) { 18 _videos = [NSMutableArray array]; 19 } 20 return _videos; 21 } 22 - (void)viewDidLoad { 23 [super viewDidLoad]; 24 25 [XMGVideo setupReplacedKeyFromPropertyName:^NSDictionary *{ 26 27 return @{ 28 @"ID":@"id" 29 }; 30 }]; 31 //1.确定请求路径 32 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"]; 33 34 //2.创建请求对象 35 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 36 37 //3.发送异步请求 38 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 39 40 //4.解析数据 41 // NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); 42 43 //4.1 创建解析器Sax 44 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; 45 46 //4.2 设置代理 47 parser.delegate = self; 48 49 //4.3 开始解析 50 [parser parse]; 51 52 //5.刷新TableView 53 [self.tableView reloadData]; 54 55 }]; 56 } 57 58 #pragma mark NSXMLParserDelegate start 59 60 /* 61 1.开始解析XML文档 62 */ 63 -(void)parserDidStartDocument:(NSXMLParser *)parser 64 { 65 NSLog(@"parserDidStartDocument"); 66 } 67 68 69 /* 70 2.解析XML文档中的每一个元素,会调用多次 71 */ 72 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict 73 { 74 // NSLog(@"didStartElement"); 75 NSLog(@"%@---%@",elementName,attributeDict); 76 77 XMGVideo *video = [[XMGVideo alloc]init]; 78 video.keyValues = attributeDict; 79 // [XMGVideo objectWithKeyValues:attributeDict]; 80 81 // [self.videos addObject:[XMGVideo objectWithKeyValues:attributeDict]]; 82 83 [self.videos addObject:video]; 84 } 85 86 /* 87 3.解析XML文档中的每一个元素结束 88 */ 89 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 90 { 91 // NSLog(@"didEndElement"); 92 } 93 94 /* 95 4.整个XML文档都已经解析完成 96 */ 97 -(void)parserDidEndDocument:(NSXMLParser *)parser 98 { 99 NSLog(@"parserDidEndDocument"); 100 } 101 #pragma mark NSXMLParserDelegate end 102 #pragma mark TableViewDataSource 103 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 104 { 105 return 1; 106 } 107 108 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 109 { 110 return self.videos.count; 111 } 112 113 114 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 115 { 116 static NSString *ID = @"video"; 117 118 //1.创建cell 119 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 120 121 //拿到该行cell对应的数据 122 // NSDictionary *videoDict = self.videos[indexPath.row]; 123 124 XMGVideo *video = self.videos[indexPath.row]; 125 126 //2.设置cell的数据 127 /* 128 cell.textLabel.text = videoDict[@"name"]; 129 NSString *detailStr = [NSString stringWithFormat:@"%@",videoDict[@"length"]]; 130 131 cell.detailTextLabel.text = detailStr; 132 NSString *baseUrl = @"http://120.25.226.186:32812/"; 133 NSURL *imageUrl =[NSURL URLWithString:[baseUrl stringByAppendingPathComponent:videoDict[@"image"]]]; 134 135 [cell.imageView sd_setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"123"]]; 136 */ 137 138 cell.textLabel.text = video.name; 139 NSString *detailStr = [NSString stringWithFormat:@"%zd",video.length]; 140 141 cell.detailTextLabel.text = detailStr; 142 NSString *baseUrl = @"http://120.25.226.186:32812/"; 143 NSURL *imageUrl =[NSURL URLWithString:[baseUrl stringByAppendingPathComponent:video.image]]; 144 145 [cell.imageView sd_setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"123"]]; 146 147 NSLog(@"ID---%@",video.ID); 148 //3.返回cell 149 return cell; 150 } 151 152 #pragma mark---TableViewDelegate 153 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 154 { 155 //1.拿到数据 156 // NSDictionary *videoDict = self.videos[indexPath.row]; 157 158 XMGVideo *video = self.videos[indexPath.row]; 159 NSString *baseUrl = @"http://120.25.226.186:32812/"; 160 NSURL *mpUrl = [NSURL URLWithString:[baseUrl stringByAppendingPathComponent:video.url]]; 161 162 // MPMoviePlayerController 163 MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:mpUrl]; 164 165 [self presentViewController:vc animated:YES completion:nil]; 166 } 167 168 @end
2.用GDataXML解析XML(DOM方式解析,p一次性将整个XML文档加载进内存,比较适合解析小文件)
- GDataXML中常用的类
- GDataXMLElement
1 //3.发送异步请求 2 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 3 4 //4.解析数据 5 //4.1 加载整个XML文档 6 GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil]; 7 8 //4.2 拿到根元素 9 NSArray *eles = [doc.rootElement elementsForName:@"video"]; 10 11 for (GDataXMLElement *ele in eles) { 12 NSLog(@"%@",ele); 13 XMGVideo *video = [[XMGVideo alloc]init]; 14 15 video.name = [ele attributeForName:@"name"].stringValue; 16 video.length = [ele attributeForName:@"length"].stringValue.integerValue; 17 video.image = [ele attributeForName:@"image"].stringValue; 18 video.url = [ele attributeForName:@"url"].stringValue; 19 20 [self.videos addObject:video]; 21 } 22 //5.刷新TableView 23 [self.tableView reloadData]; 24 25 }];
浙公网安备 33010602011771号