UI进阶:数据解析(XML解析和JSON解析)

本文探讨了iOS开发中UI进阶的两个重要环节:XML解析和JSON解析。XML解析主要介绍SAX解析和DOM解析,其中SAX解析使用NSXMLParser,强调了必须调用parse方法触发解析过程,并列出关键代理方法。DOM解析部分提到了使用GDataXMLNode进行解析。而JSON解析部分则简要提及。
摘要由CSDN通过智能技术生成


IOS数据解析主要有XML解析和JSON解析两种方式,下面以本地数据的方式来说明这两种方式

XML解析

下面是一段简单不完整的XML代码
<Teachers>
    <Teacher>
        <name>草哥</name>
        <gender>男</gender>
        <age>24</age>
    </Teacher>
    <Teacher>
        <name>好贱</name>
        <gender>男</gender>
        <age>25</age>
    </Teacher>
    <Teacher>
        <name>你妹</name>
        <gender>男</gender>
        <age>40</age>
    </Teacher>
</Teachers>
每一个XML文件都有一组唯一根节点,<Teachers></Teachers>,根节点下有若干组子节点<Teacher></Teacher>,每一组子节点又包含了三个自己的子节点(<name></name>,<gender></gender>,<age></age>);
<Teacher>代表的是开始标签,<>草哥<>中间的草哥代表的是标签内容,</Teacher>代表的是结束标签
对于每一对节点来说,如果<>和<>之间有内容,则代表的是这个节点包含的内容;如果<>和<>之间为空,说明这个节点包含的时\n,也就是换行符

XML解析主要有两种方式:SAX解析和DOM解析

SAX解析是利用系统类NSXMLParser进行解析

// 1、 获得文件路径 (第一步和第二部以后会被网络请求取代)
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Teacher" ofType:@"xml"];

    // 2、 根据路径获取数据 (NSData)
    NSData *data = [NSData dataWithContentsOfFile:filePath];
   
    // 3、 创建NSXMLParser对象,进行对data的解析
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
 设置代理,记得先遵守协议<NSXMLParserDelegate>

注意SAX解析必须要调用parse方法,否则不会去走代理方法

//  必须调用这个方法,否则不会去走代理方法
    [parser parse];

主要用到的方法

  1. 根据网址接口解析数据 
    - (instancetype)initWithContentsOfURL:(NSURL *)url;
  2. 根据本地数据解析 
    - (instancetype)initWithData:(NSData *)data;
  3. 开始进行解析 
    - (BOOL)parse;


应用SAX解析主要用到五种代理方法

1、当开始解析的时候调用的方法(读取到开始根节点时调用的方法)

- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"开始解析!");
    self.modelArray = [NSMutableArray array];
}

2、当读取到开始标签时候调用的方法

//  读取到开始标签时候调用的方法
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    NSLog(@"开始标签:%@",elementName);
}
3、当读取到标签内容时调用的方法

// 读取到标签内容时候调用的方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"标签内容:%@",string);
    //  参数的string有可能是/n,如果为/n,那么下一次调用的肯定是开始标签的方法;如果是真正的内容,那么下一次调用的肯定是结束标签的方法
}

4、当读取到结束标签时调用的方法

//  读取到结束标签时候调用的方法
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"结束标签:%@",elementName);
}

5、当读取到结束解析的时候调用的方法

//  结束解析的时候调用的方法
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"结束解析!");
}

DOM解析是利用谷歌提供的GDataXMLNode解析
//  1、 获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"];
    
    //  2、 获取文件中的数据
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    
    // 3、利用GDataXMLDocument解析数据
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; //  用&error可以去查看错误信息
    
    //  1.获取所有的信息<Teachers></Teachers>
    GDataXMLElement *rootElement = [document rootElement];
    
    
    //  2、 获取装载所有<Teacher></Teacher>的数组
    NSArray *childArray = [rootElement children];
    
    //装载model的数组进行初始化
    self.modelArray = [NSMutableArray array];
    
    for (int i = 0; i < childArray.count; i++) {
        //  model 初始化
        Model *model = [[Model alloc] init];
        //  每一次对应的<Teacher></Teacher>
        GDataXMLElement *oneElement = childArray[i];
        //  获取name数组
        NSArray *nameArray = [oneElement elementsForName:@"name"];
        //  获取name 内容
        GDataXMLElement *nameElement = nameArray[0];
        //  6、转成字符串
        NSString *nameString = [nameElement stringValue];
        model.name = nameString;
    }
    
}

JSON解析

首先,我们在model文件中声明与数据源文件中相同的属性名
@property (nonatomic,copy)NSString *address;
@property (nonatomic,copy)NSString *cinemaName;

在model的.h文件中声明一个方法完成对数组的创建以及数据的解析和赋值model属性的过程
//  在此方法内部进行数组的创建以及数据的解析和赋值model属性的过程,然后返回给控制器,控制器中的self.modelArray进行接收这个数组
+ (NSMutableArray *)modelConfigureJson:(NSDictionary *)jsonDic;

在model的.m中实现这个方法
+ (NSMutableArray *)modelConfigureJson:(NSDictionary *)jsonDic {
    NSMutableArray *modelArray = [NSMutableArray array];
    // 找到result对应的字典
    NSDictionary *resultDic = [jsonDic objectForKey:@"result"];
    // 找到data  key值对应的数组
    NSArray *dataArray = [resultDic objectForKey:@"data"];
    //  遍历数组,数组中是N个字典,每个字典相当于一个model
    for (NSDictionary *dataDic in dataArray) {
        Model *model = [[Model alloc] init];
        //  相当于字典中的key值对应的value分别赋值给model中与key值对应的属性,如果model中的属性与key值的个数或者名称不对号,那么我们必须在model类中实现setValueForUndeFinedKey这个方法(空实现就行)防止崩溃
        //  如果key值对应的value不是一个字符串,我们用字符串接收的时候需要将其转成字符串
        [model setValuesForKeysWithDictionary:dataDic];
        [modelArray addObject:model];
        [model release];
    }
    return modelArray;
}

在controller类中利用系统类解析JSON数据
- (void)jsonWithSysytem {
    //  1、 获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DouBan" ofType:@"json"];
    
    //  2、 获取文件中的数据
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    
    // 3、 寻找最外层的字典或者数组,如果是字典,就用字典接收,如果是数组,就用数组接收,大部分的最外层都是字典
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    
    self.modelArray = [Model modelConfigureJson:dic];
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值