AFNetworking3.0解析XML

220 阅读2分钟

前言:

http协议是服务器与客户端交流数据最常见的方式。一般来说,数据格式是JSON,也有XML的情况。JSON格式都会解析,如何解析XML呢? —— 本文是基于AFNetworking3.2.1版本

参考资料:

划重点!

一般来说,我们进行HTTP请求,会实例化一个AFHTTPSessionManager对象,并设置一些属性:

manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", @"text/plain",nil];
manager.requestSerializer.timeoutInterval = 30.0f;

此处我们没有设置managerresponseSerializer属性,responseSerializer默认类型是AFJSONResponseSerializer,很明显要进行请求XML格式的数据,不能使用AFJSONResponseSerializer。 以下是关键代码:

AFXMLParserResponseSerializer *response = [AFXMLParserResponseSerializer serializer];
manager.responseSerializer = response;

网上有些说法是

AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.acceptableContentTypes = [NSSet setWithObjects:@"text/xml", nil];
manager.responseSerializer = response;

这种用法是不对的!这里responseSerializer的类型必须是AFXMLParserResponseSerializer,至于为何会出现这样的解决方案,可能是因为答者简单的看到错误返回是“不能接收text/xml类型的数据”而猜测的答案,并没有加以验证;或者说,此方法在低版本的 AFNetworking 中可以使用。

用法如下

[manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"LenovoID 登录请求结果:%@",responseObject);
    NSXMLParser *xmlparser = responseObject;
    [xmlparser setDelegate:self];
    [xmlparser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"LenovoID 登录请求失败:%@", [error localizedDescription]);
}];

XML解析需要实现NSXMLParserDelegate协议

  • Objective-C 版
#pragma mark - NSXMLParser delegate
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"XML文档开始");
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"XML文档结束");
}

- (void)parser:(NSXMLParser *)parser foundElementDeclarationWithName:(NSString *)elementName model:(NSString *)model{
    NSLog(@"elementName:%@",elementName);
}
  • Swift 版
extension LoginWebViewController: XMLParserDelegate{
    
    func parserDidStartDocument(_ parser: XMLParser) {
        print("XML文档开始")
    }
    
    func parserDidEndDocument(_ parser: XMLParser) {
        print("XML文档结束")
    }
    
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        print("XML开始元素:",elementName)
    }
    
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        print("XML元素内容:",string)
    }
    
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        print("XML结束元素:",elementName)
    }
    
    
}

NSXMLParser的用法:

AFNetworking是最基本的iOS开发技巧,此处就不给出具体实现的Demo了。XML 解析最重要的是设置AFHTTPSessionManager对象的responseSerializer属性值为AFXMLParserResponseSerializer对象。