ios开发系列之XML解析和JSON解析数据

当客户端向服务器请求数据返回结束的时候,我们为了大多数人能看懂返回的数据,需要对这些数据进行解析,以获取关键的信息.具体请看下面:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值