解析XML
本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理
需要解析的xml文件如下,users.xml
<?xml version="1.0" encoding="UTF-8"?> <AllUsers> <message>用户信息</message> <user> <name>芳仔小脚印</name> <age>10</age> <school>JiangSu University</school> </user> <user> <name>毒虫</name> <age>22</age> <school>NanJing University</school> </user> <user> <name>女神</name> <age>23</age> <school>HongKong University</school> </user> </AllUsers>
我们用一个数组来存放,最终数据结构为
( { message = "用户信息"; }, { age = 10; name = "芳仔小脚印"; school = "JiangSu University"; }, { age = 22; name = "毒虫"; school = "NanJing University"; }, { age = 23; name = "女神"; school = "HongKong University"; } )
解析步骤
一、声明代理 NSXMLParserDelegate
二、解析
// 遇到节点message和user时作为一个字典存放 NSArray *keyElements = [[NSArray alloc] initWithObjects:@"message",@"user", nil]; // 需要解析的字段 NSArray *rootElements = [[NSArray alloc] initWithObjects:@"message",@"name",@"age",@"school", nil]; // 获取xml文件的路径 NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"xml"]; // 转化为Data NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath]; // 初始化 NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data]; // 代理 xmlParser.delegate = self; // 开始解析 BOOL flag = [xmlParser parse]; if (flag) { NSLog(@"解析成功"); } else{ NSLog(@"解析出错"); }
NSString *currentElement; NSString *currentValue; NSMutableDictionary *rootDic; NSMutableArray *finalArray;
#pragma - mark 开始解析时 -(void)parserDidStartDocument:(NSXMLParser *)parser { // 用数组存储每一组信息 finalArray = [[NSMutableArray alloc] init]; } #pragma - mark 发现节点时 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { for(NSString *key in self.keyElements){ if ([elementName isEqualToString:key]) { // 关键节点开始时,初始化一个字典来存放值 rootDic = nil; rootDic = [[NSMutableDictionary alloc] initWithCapacity:0]; } else { for(NSString *element in self.rootElements){ if ([element isEqualToString:element]) { currentElement = elementName; currentValue = [NSString string]; } } } } } #pragma - mark 发现节点值时 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (currentElement) { currentValue = string; [rootDic setObject:string forKey:currentElement]; } } #pragma - mark 结束节点时 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if (currentElement) { [rootDic setObject:currentValue forKey:currentElement]; currentElement = nil; currentValue = nil; } for(NSString *key in self.keyElements){ if ([elementName isEqualToString:key]) { // 关键节点结束时,将字典存放在数组中 if (rootDic) { [finalArray addObject:rootDic]; } } } } #pragma - mark 结束解析 -(void)parserDidEndDocument:(NSXMLParser *)parser { }
( { message = "\U7528\U6237\U4fe1\U606f"; }, { age = 10; name = "\U82b3\U4ed4\U5c0f\U811a\U5370"; school = "JiangSu University"; }, { age = 22; name = "\U6bd2\U866b"; school = "NanJing University"; }, { age = 23; name = "\U5973\U795e"; school = "HongKong University"; } )
使用SBJson拼接和解析json
1.ios解析json
使用开源json包,项目地址:
http://www.superloopy.io/json-framework/
NSData * responseData = [respones responseData]; NSString * strResponser = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; SBJsonParser * parser = [[SBJsonParser alloc]init]; NSMutableDictionary *dicMessageInfo = [parser objectWithString:strResponser]; // 解析成json解析对象 [parser release]; //发送者 NSString * sender = [dicMessageInfo objectForKey:@"sender"];
//要上传的字符串 NSString *dataStr=[[NSString alloc] initWithString:@"{\"cross\":{\"1\":\"true\",\"2\":\"false\",\"3\":\"true\"}}"]; //获取响应返回字符串 NSData * responseData = [respones responseData]; NSString * strResponser = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; //嵌套解析 SBJsonParser * parser = [[SBJsonParser alloc]init]; NSMutableDictionary *dicMessageInfo = [parser objectWithString:strResponser]; // 解析成json解析对象 NSMutableDictionary * cross = [dicMessageInfo objectForKey:@"cross"]; NSString *cross1= [cross objectForKey:@"1"]; //解析json到各个字符串 //发送者 [parser release]; NSLog(@"cross1: %@",cross1);
通过使用SBJson中的SBJsonWriter类的方法- (NSString*)stringWithObject:(id)value可以将一个对象中的值格式化为json字符串,符合key/value格式的数据封装到NSDictionary后可以使用该方法进行格式化,其他数据通过拼接字符串的方式格式化。
在拼接过程中可以使用类NSMutableString的方法:
- (void)appendString:(NSString *)aString;、 - (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
-(NSString *) getJsonString { NSMutableString *json = [NSMutableString stringWithCapacity:128]; NSString *jsonString=nil; SBJsonWriter *writer = [[SBJsonWriter alloc] init]; [json appendString:@"{\"data\":{"]; [json appendFormat:@"\"%@\":\"%d\",",@"reset",reset]; if(missionStatus!=NULL) { jsonString=[writer stringWithObject:status]; if(jsonString!=NULL) { [json appendString:@"\"status\":"]; [json appendString:jsonString]; } } [json appendString:@"}}"]; return json; }
NSDictionary *dataDictionary= [NSDictionary dictionaryWithObjectsAndKeys:mac,@"mac", game,@"game", devicetoken,@"devicetoken", device,@"device", gv,@"gv", lang,@"lang", os,@"os", hardware,@"hardware", down,@"down",nil]; NSDictionary *parmDictionary= [NSDictionary dictionaryWithObjectsAndKeys:@"getSession",@"act", dataDictionary,@"data",nil]; NSDictionary *jsonDictionary=[NSDictionary dictionaryWithObjectsAndKeys:pv,@"pv", parmDictionary,@"param",nil]; SBJsonWriter *writer = [[SBJsonWriter alloc] init]; NSString *jsonString=nil; jsonString=[writer stringWithObject:jsonDictionary]; NSLog(@"%@",jsonString);
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。