当客户端向服务器请求数据返回结束的时候,我们为了大多数人能看懂返回的数据,需要对这些数据进行解析,以获取关键的信息.具体请看下面:
解析关键 :xml
解析是从上往下解析的,弄清楚对应标签的层次关系,同一层次的为相同类型,同一层次的标签比较多的时候可以视为模型的属性
例如 :下面这个xml文档,
那么我们可以创建一个food
模型,name,price,detail,calories
就是该模型的属性,在解析过程中我们可以依次获得带有各自属性的模型.通过将模型依次存放在可变数组中,我们就可以方便的取得想要的数据了
<breakfast_menu>
<food>
<name>Belgian Wafflesname>
<price>$5.95price>
<detail>two of our famous Belgian Waffles with plenty of real maple syrupdetail>
<calories>650calories>
food>
<food>
<name>Strawberry Belgian Wafflesname>
<price>$7.95price>
<detail>light Belgian waffles covered with strawberries and whipped creamdetail>
<calories>900calories>
food>
<food>
<name>Berry-Berry Belgian Wafflesname>
<price>$8.95price>
<detail>light Belgian waffles covered with an assortment of fresh berries and whipped creamdetail>
<calories>900calories>
food>
<food>
<name>French Toastname>
<price>$4.50price>
<detail>thick slices made from our homemade sourdough breaddetail>
<calories>600calories>
food>
<food>
<name>Homestyle Breakfastname>
<price>$6.95price>
<detail>two eggs, bacon or sausage, toast, and our ever-popular hash brownsdetail>
<calories>950calories>
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
数据,本质就是一个字典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