对JSON习以为常之后,使用XML多少有点不习惯。其实二者差不多。这里讲述一下iOS自带的NSXMLParserDelegate的使用。
1.头文件中声名协议<NSXMLParserDelegate>,定义两个方法:-(void)postRequest 和 -(void)startParser:(NSData*)_data
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了,成功获取到后台数据并解析成所需要的内容。