美文网首页我爱编程
AFN如何获取并解析XML

AFN如何获取并解析XML

作者: Steven_Wu | 来源:发表于2017-02-05 18:08 被阅读348次

    开发中如果通过网络请求,接收服务器返回的是XML数据,需要将XML数据解析。

    首先AFN需要加载一下XML解析器,然后做网络请求,把参数传进去,然后我们获取到的responseObject是NSXMLParser类型。

    接着我们需要解析NSXMLParser数据,我们要设置NSXMLParserDelegate代理,开始解析。通过elementName来传输数据,目的是在- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 中做处理获取。

    代码示意:
    1、整个AFN的网络请求代码

    - (void)loadData
    {
        // TEST URL
        NSDictionary *params = [self generateRequestParams];
        NSString *url = @"http://localhost:5000/?user_id=858&token=C9F";
    
        AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
        // XML形式解析服务器
        mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
        [mgr GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
            // XMLParser
            // 1.根据需要解析的XML数据, 创建NSXMLParser对象(这里直接将responseObject赋值)
            NSXMLParser *parser = responseObject;
    
            // 2.设置代理, 通过代理方法告诉NSXMLParser, 需要获取哪些元素和哪些属性
            parser.delegate = self;
    
            // 3.开始解析
            [parser parse];
    
            self.draftBillTableView.bills = self.bills;
    
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            [MBProgressHUD showError:@"网络错误"];
        }];
    }
    

    2、XML 的解析过程

    #pragma mark - NSXMLParserDelegate
    #pragma mark - 开始解析
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
    {
        self.currentElement = elementName;
    
        if([self.currentElement isEqualToString:@"data"]){
            self.bill = [[CZBill alloc] init];
        }
    }
    
    #pragma mark - 获取节点内容
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if([self.currentElement isEqualToString:@"type"])
            self.bill.type = [string intValue];
        else if([self.currentElement isEqualToString:@"date"])
            self.bill.date = [self stringToDate:string];
        else if([self.currentElement isEqualToString:@"money"])
            self.bill.money = string;
        else
            return;
    }
    
    #pragma mark - 结束解析
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"data"]) {
            [self.bills addObject:self.bill];
        }
        self.currentElement = nil;
        [self.draftBillTableView reloadData];
    }
    

    3、解析数据如下:

    <data>
        <type>0</type>
        <money>5000</money>
        <date>1995-03-16 11:08</date>
    </data>
    

    转自:http://blog.csdn.net/jianloubang5433/article/details/52886613?locationNum=4&fps=1

    相关文章

      网友评论

        本文标题:AFN如何获取并解析XML

        本文链接:https://www.haomeiwen.com/subject/vnveittx.html