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

来源:互联网 发布:三维b超单数据怎么看 编辑:程序博客网 时间:2024/05/19 00:44

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
原创粉丝点击