XML请求数据和解析

对JSON习以为常之后,使用XML多少有点不习惯。其实二者差不多。这里讲述一下iOS自带的NSXMLParserDelegate的使用。


1.头文件中声名协议<NSXMLParserDelegate>,定义两个方法:-(void)postRequest 和 -(void)startParser:(NSData*)_data,定义对象:NSData *responseData(后台返回的NSData)、NSString *currentTagName(解析时获取到的当前字段)、NSMutableArray *name(我用来存储解析出来的name字段的数组)、NSMutableArray *code(我用来存储解析出来的code字段的数组)NSMutableDictionary *regionDic(我用来存储将name和code对映的Dictionary


2.源文件中实现,代码如下:

-(void)postRequest
{
    //prepar request
    NSString *urlString = [NSString stringWithFormat:@"http://122.113.26.11/golive/api/loadRegionList.do"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ;
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];
    
    //set headers 设置contentType和HTTPHeaderField
    NSString *contentType = [NSString stringWithFormat:@"text/xml"];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    
    //create the body 在此处拼接XML字段,将每段尖括号的内容拆开拼接起来
    NSMutableData *postBody = [NSMutableData data];
    //    [postBody appendData:[[NSString stringWithFormat:@"<xml>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"<request website=\"http://XXXXXXXXXXXXXX\">"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"<device devmodel=\"\" dnum=\"\" didtoken=\"\" dver=\"\"/>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"<live mac=\"XXXXX\" deviceid=\"\" livetoken=\"\" livever=\"\"/>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"</parameter>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"</request>"] dataUsingEncoding:NSUTF8StringEncoding]];
 
    //post
    [request setHTTPBody:postBody];
    
    //get response
    NSHTTPURLResponse* urlResponse = nil;
    NSError *error = [[NSError alloc] init];
    self.responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"regionResponse Code: %ld", (long)[urlResponse statusCode]);

    if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
        NSLog(@"regionResponse: %@", result);
        
        //这里获取到服务器返回的内容
        
    }
    
    NSString* aStr;
    aStr = [[NSString alloc] initWithData:postBody encoding:NSASCIIStringEncoding];
    NSLog(@"reg==========%@",aStr);
}

//自定义一个 PraxMovie 方法,参数时NSDate型的数据,用来传递接受到的数据
- (void)startParser:(NSData*)data
{
    //NSXMLParser解析xml格式的数据,在这里初始化,并赋值
    NSXMLParser* parser = [[NSXMLParser alloc]initWithData:data];
    parser.delegate = self;
    [parser parse];
    NSLog(@"解析完成。。。");
}

//文档出错的时候触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"%@",parseError);
}

//遇到一个开始标签时候触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    self.currentTagName = elementName;
	//region是需要解析的内容所对应的字段
    if ([currentTagName isEqualToString:@"region"]) {       
	//name和code是需要解析的内容所对应的字段
        [self.name addObject:[attributeDict objectForKey:@"name"]];
        [self.code addObject:[attributeDict objectForKey:@"code"]];
        [self.regionDic setObject:[attributeDict objectForKey:@"code"] forKey:[attributeDict objectForKey:@"name"]];
        
        NSLog(@"language:%@;code:%@",[attributeDict objectForKey:@"name"],[attributeDict objectForKey:@"code"]);
    }
    
}

//遇到结束标签时候出发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName;
{
    self.currentTagName = nil;
}

这样就OK了,成功获取到后台数据并解析成所需要的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值