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数据,本质就是一个字典keyerrNum,errMsg,retData.而通过retData取得值是一个字典,这个字典的keytelString,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

0 0
原创粉丝点击