XML

文档声明
语法
语法
语法
XML解析
XML解析
  • NSXMLParser解析XML
#import "ViewController.h"
#import "XMGVideo.h"
#import "MJExtension.h"

@interface ViewController ()
@property (nonatomic,strong) NSMutableArray *videos;
@end

@implementation ViewController

-(NSMutableArray *)videos
{
    if (_videos == nil) {
        _videos = [NSMutableArray array];
    }
    return _videos;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //01 确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
    
    //02 创建会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //03 创建TASK 执行Task
    [[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //在进行字典转模型之前手动的设置替换 ID - id
        [XMGVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
            return @{@"ID":@"id"};
        }];
        
        //04 解析服务器返回的数据
        //001 创建XML解析器(NSXMLParser-SAX)
        NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
        
        //002 设置代理
        parser.delegate = self;
        
        //003 开始解析 本身是阻塞式的
        [parser parse];
        
        //06 刷新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [self.tableView reloadData];
        }];
        
    }] resume];

}

#pragma mark -----------------------
#pragma mark NSXMLParserDelegate
//01 开始解析XML文档的时候调用
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"parserDidStartDocument");
}

//02 开始解析XML文档中某个元素的时候调用 该方法会调用多次
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"didStartElement--开始解析的元素名称:%@\n%@",elementName,attributeDict);
    
    //过滤掉根元素
    if ([elementName isEqualToString:@"videos"]) {
        return;
    }
    
    //001 把字典转换为模型
    XMGVideo *video =  [XMGVideo mj_objectWithKeyValues:attributeDict];
    
    //002 把模型添加到全局的可变数组中保存起来
    [self.videos addObject:video];
}

//03 某个元素解析完毕之后会调用该方法
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"didEndElement");
}

//04 整个XML文档解析完毕
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"parserDidEndDocument");
}
@end
  • GDataXML解析XML
第一步
第二步
非ARC尝试自动转换车ARC,不行的话手动转换
手动转成ARC
---------------------GDataXML解析XML-------------------------
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //01 确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
    
    //02 创建会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //03 创建TASK 执行Task
    [[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //在进行字典转模型之前手动的设置替换 ID - id
        [XMGVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
            return @{@"ID":@"id"};
        }];
        
        //04 解析服务器返回的数据 XML
        //001 把整个XML文档加载进内存
        GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
        
        //002 先得到根元素,然后获取根元素内部所有名称为video的子元素
        NSArray *eles = [doc.rootElement elementsForName:@"video"];
        
        //03 遍历整个子元素数组,然后得到数组中每个元素的内部属性
        for (GDataXMLElement *ele in eles) {
            
            //创建模型
            XMGVideo *video = [[XMGVideo alloc]init];
            
            //得到子元素的属性
            video.name = [ele attributeForName:@"name"].stringValue;
            video.ID =[ele attributeForName:@"id"].stringValue;
            video.length =[ele attributeForName:@"length"].stringValue;
            video.image = [ele attributeForName:@"image"].stringValue;
            video.url = [ele attributeForName:@"url"].stringValue;
            
            //把模型保存到数据源
            [self.videos addObject:video];
        }
        
        //06 刷新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [self.tableView reloadData];
        }];
        
    }] resume];

}

你可能感兴趣的:(XML)