ios开发系列之XML解析和JSON解析数据
来源:互联网 发布:中国的阿拉伯之春 知乎 编辑:程序博客网 时间:2024/05/27 21:49
当客户端向服务器请求数据返回结束的时候,我们为了大多数人能看懂返回的数据,需要对这些数据进行解析,以获取关键的信息.具体请看下面:
XML解析:
解析关键 :xml
解析是从上往下解析的,弄清楚对应标签的层次关系,同一层次的为相同类型,同一层次的标签比较多的时候可以视为模型的属性
例如 :下面这个xml文档,<breakfast_menu>中包含许多<food>,而<food>中包含了<name>,<price>,<detail>,<calories>
那么我们可以创建一个food
模型,name,price,detail,calories
就是该模型的属性,在解析过程中我们可以依次获得带有各自属性的模型.通过将模型依次存放在可变数组中,我们就可以方便的取得想要的数据了
<?xml version="1.0" encoding="utf-8"?><breakfast_menu> <food> <name>Belgian Waffles</name> <price>$5.95</price> <detail>two of our famous Belgian Waffles with plenty of real maple syrup</detail> <calories>650</calories> </food> <food> <name>Strawberry Belgian Waffles</name> <price>$7.95</price> <detail>light Belgian waffles covered with strawberries and whipped cream</detail> <calories>900</calories> </food> <food> <name>Berry-Berry Belgian Waffles</name> <price>$8.95</price> <detail>light Belgian waffles covered with an assortment of fresh berries and whipped cream</detail> <calories>900</calories> </food> <food> <name>French Toast</name> <price>$4.50</price> <detail>thick slices made from our homemade sourdough bread</detail> <calories>600</calories> </food> <food> <name>Homestyle Breakfast</name> <price>$6.95</price> <detail>two eggs, bacon or sausage, toast, and our ever-popular hash browns</detail> <calories>950</calories> </food></breakfast_menu>
先创建几个全局变量:
NSMutableArray *array; //存放模型的数组 FoodModel *model; //模型对象 NSMutableString *buffer; //每个标签中内容
然后根据获得数据创建一个系统提供的XML解析的实例
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
parser.delegate = self; //设置解析代理NSXMLParserDelegate[parser parse];//开始解析,在解析的过程中就会调用代理方法
#pragma mark--NSXMLParserDelegate//******************开始解析文档******************- (void)parserDidStartDocument:(NSXMLParser *)parser{}//******************开始标签******************- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ if ([elementName isEqualToString:@"breakfast_menu"]) {// 下一次取出的信息就是我们的FoodModel类的信息了,那么我们就可以在这里初始化模型数组 array = [[NSMutableArray alloc]init]; } if ([elementName isEqualToString:@"food"]) {// 读取到food的时候接下来就是model的属性了,那么我们在这里就可以创建model类 model = [[FoodModel alloc]init]; } if ([elementName isEqualToString:@"name"]) {// 读取到name的时候,接下来就是标签的内容了,那么我们在这里就可以创建buffer了 buffer = [[NSMutableString alloc]init]; } if ([elementName isEqualToString:@"price"]) { [buffer setString:@""];//读到下一个标签的时候将buffer清空 } if ([elementName isEqualToString:@"detail"]) { [buffer setString:@""]; } if ([elementName isEqualToString:@"calories"]) { [buffer setString:@""]; }}//******************标签中内容******************- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ [buffer appendString:string];//如果标签中有很多数据,那么此方法可能会执行多次}//******************结束标签******************- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"name"]) { model.name = buffer; } if ([elementName isEqualToString:@"price"]) { model.price = buffer; } if ([elementName isEqualToString:@"detail"]) { model.detail = buffer; } if ([elementName isEqualToString:@"calories"]) { model.calories = buffer; } if ([elementName isEqualToString:@"food"]) { [array addObject: model]; } }//******************解析结束******************- (void)parserDidEndDocument:(NSXMLParser *)parser{}
注意 :如果xml
格式不是以上面那种包含开始标签和结束标签,而是
<city quName="黑龙江" pyName="heilongjiang" cityname="哈尔滨"/>
这种形式的,那么在读取开始标签的代理方法中参数attributeDict
即为标签中的内容,此时将attributeDict
添加到数组中即可.
JSON解析
解析关键 :理解JSON
数据实质就是数组()与字典{}的相互嵌套,分清楚层次关系,记得数据在键值对中
例如 :下面这个JSON
数据,本质就是一个字典key
有errNum,errMsg,retData
.而通过retData
取得值是一个字典,这个字典的key
有telString,province,carrier
三个,最后根据这三个键就可以取出对应的值了
{errNum: 0,errMsg: "success",retData: { telString: "15846530170", //手机号码 province: "黑龙江", //省份 carrier: "黑龙江移动" //运营商 }}
主要方法:
//该方法返回一个实例对象,根据JSON数据结构来确定是array,还是dictionary.[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]
然后根据上面返回的实例对象一层一层的解析(objectForKey:或者objectAtIndex:)
将字典转模型的方法有2种:一种是字典中的值一一对应赋给模型的属性(适合key较少的情况),
另一种是使用KVC
的方法setValuesForKeysWithDictionary:
这种适合字典中key较多的时候使用的,
具体请点击这里http://blog.csdn.net/u012519228/article/details/48265687
- ios开发系列之XML解析和JSON解析数据
- 23>IOS数据解析---------之JSON和XML解析
- 玩转iOS开发 - JSON 和 Xml 数据解析
- iOS开发-JSON和XML的数据解析
- iOS之数据解析 (JSON 、XML)
- IOS 请求数据解析 XML 和 JSON
- iOS 数据解析 JSON 和 XML
- IOS开发之Json数据解析
- iOS 数据解析 JSON XML
- iOS开发之解析XML格式数据
- iOS开发之解析XML数据
- iOS开发: 网络解析数据之JSON解析
- Json解析 开发实践 XML和JSON格式的数据
- XML 和 JSON 解析数据
- XML和JSON数据解析
- Json和Xml数据解析
- iOS开发——XML/JSON数据解析
- iOS开发——XML/JSON数据解析
- 大数相乘
- unity里的几个控件说明
- GitHub
- 安卓软件第一次打开时引导界面以及打开后停留界面
- 9余数定理
- ios开发系列之XML解析和JSON解析数据
- 进程间通信简介(二)——管道
- Codeforces 589D Boulevard 线段相交
- LeetCode 36: Valid Sudoku
- zoj3905 Cake (简单dp)
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest H题: Hashing [基础DP]
- HDU-1551 Cable master
- kafka及zookeeper安装部署
- Partition函数