解析来自服务器返回的XML数据,介绍两种方式:
1,NSXMLParser解析器 : SAX方式解析(从根元素开始,按顺序一个一个的解析,适合解析大文件);
2,GDataXML : DOM方式解析(一次性将整个XML文档加载进内存,适合解析小的文件);
1 NSXMLParser
1, 确认请求路径
NSURL *url = [NSURL URLWithString:@"xxx"];
2, 创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
3, 创建请求Task
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:
^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//创建XML解析器 NSXMLParser(SAX---从根元素一个元素一个元素的解析)
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//设置代理
parser.delegate = self;
//开始解析(同步是会阻塞当前执行路径)
[parser parse];
}];
4,执行Task
[dataTask resume];
5,代理方法
//1.当开始解析整个XML文档的时候回调用
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"parserDidStartDocument");
}
//2.开始解析某个元素的时候调用(调用多次)
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:
(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"didStartElement %@元素开始解析--%@",elementName,attributeDict);
}
//3.某个元素解析完毕的时候调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"didEndElement--%@元素解析完毕",elementName);
}
//4.整个XML文档解析完毕的时候调用
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"parserDidEndDocument");
}
2 GDataXML
使用此方法解析,需先导入一个框架:GDataXML,接着按照框架注释配置编译器
GDataXML框架是MRC的,所以还需要告诉编译器以MRC的方式处理GDataXML的代码
1, 确认请求路径
NSURL *url = [NSURL URLWithString:@"xxx"];
2, 创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
3, 创建请求Task
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:
^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//加载XML文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
//获得根元素 得到根元素内部所有名字为abc的子元素
NSArray *eles = [doc.rootElement elementsForName:@"abc"];
}];
4,执行Task
[dataTask resume];