XML请求数据和解析
发布时间:2020-12-16 05:50:34 所属栏目:百科 来源:网络整理
导读:对JSON习以为常之后,使用XML多少有点不习惯。其实二者差不多。这里讲述一下iOS自带的 NSXMLParserDelegate 的使用。 1.头文件中声名协议 NSXMLParserDelegate ,定义两个方法: -( void )postRequest 和 -( void )startParser:( NSData *)_data,定义对象:
对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了,成功获取到后台数据并解析成所需要的内容。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |