XML解析

Posted on 2016-07-19 20:42  柠檬片  阅读(110)  评论(0)    收藏  举报

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

    
    当扫描到元素的开始时调用(attributeDict存放着元素的属性)

    - (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中常用的类
    GDataXMLDocument:代表整个XML文档
  
  • GDataXMLElement
    代表文档中的每个元素
    使用attributeForName:方法可以获得属性值
 
 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     }];
View Code