随意细解:UI -- 数据结构解析

XML数据解析

解析的前提:提前约定好格式、数据提供⽅按照格式提供数据、数据获取⽅则按照格式获取数据。
XML:Extensible Markup language(可扩展标记语⾔),主流数据格式之⼀,可以⽤来存储和传输数据。

SAX解析 —- Simple API for XML

利用的是系统的NSXMLParser,以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)。真谛:逐行解析

解析xml数据

Student.xml如图所示:

这里写图片描述

    // 创建要分析的data(二进制对象)
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 创建分析人
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    // 驱动事件(设置代理)
    parser.delegate = self;
    // 开始分析
    [parser parse];
    [parser release];

代理方法 (数据转model)

parserDidStartDocument方法和parserDidEndDocument方法只运行一次,而didStartElement方法、foundCharacters方法 和 didEndElement方法循环调用。所以在开始分析文件时初始化数组,用来保存model。在开始遇到节点方法中判断是否是“Student”节点,如果是,则初始化model。在发现字符的方法中保存字符串数据。在遇到结束节点时,将节点之前的数据放到model对应的属性中,比如< / name > 之前的字符保存在model的name属性中。如果结束节点是Student,就把model放进数组,并释放model。

定义数组属性dataArr,用来保存model。并且定义字符串属性 str。

  1. 初始化数组 保存model

    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
    self.dataArr = [NSMutableArray array];
    }
  2. 遇到student节点时初始化model

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
    // 遇到student节点时初始化model
    if ([elementName isEqualToString:@"Student"]) {
        self.model = [[studentModel alloc]init];
    }
    }
    
  3. 保存字符串

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        // 保存字符串
        self.str = string;
    }
  4. 结束节点对model进行赋值

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
    if ([elementName isEqualToString:@"Student"]) {
        [self.dataArr addObject:self.model];
        [self.model release];
    }else if ([elementName isEqualToString:@"name"]){
        self.model.name = self.str;
    }else if ([elementName isEqualToString:@"gender"]){
        self.model.gender = self.str;
    }else if ([elementName isEqualToString:@"age"]){
        self.model.age = self.str;
    }else {
        self.model.motto = self.str;
    }
    }

DOM解析 —- Document Object Model

Document Object Model(⽂档对象模型)。依靠第三方类库GDataXMLNode,而GDataXMLNode类 依靠系统的libxml2 来实现,所以需要导入libxml2框架。
真谛:把所有的节点一次性读取 并转化为 树形结构 整体解析(与SAX解析的区别)

步骤

导入GDataXMLNode。Student.xml如图所示:

这里写图片描述

  1. 导入libxml2框架

    这里写图片描述

  2. 增加查询路径

    这里写图片描述

    路径: /usr/include/libxml2

  3. Dom解析方法

    - (void)GDataXMLNodeUpdata
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
        // 创建data
        NSData *data = [NSData dataWithContentsOfFile:path];
        // 创建一个空的错误信息
        NSError *error = nil;
        // 初始化文件对象
        GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
        // 获取根节点
        GDataXMLElement *rootelement = document.rootElement;
    
        // 获取根节点下 Student节点
        NSArray *elementArr = [rootelement elementsForName:@"Student"];
        // 遍历数组,对每一个Student节点继续化整为零
    
        self.dataArr = [NSMutableArray array];
    
        for (GDataXMLElement *element in elementArr) {
            StudentModel *model = [[StudentModel alloc]init];
            model.name = [self elementInArray:element elementName:@"name"];
            model.gender = [self elementInArray:element elementName:@"gender"];
            model.age =[self elementInArray:element elementName:@"age"];
            model.motto =[self elementInArray:element elementName:@"motto"];
            // 把model装进数组
            [self.dataArr addObject:model];
            [model release];
        }
    
    }
    
    // 1.找爆红的对象(是方法中没有的,需要外界传进来)
    // 2.找可变的对象 (例如name等 这个也是需要传进来)
    // 3.选好返回值
    - (NSString *)elementInArray:(GDataXMLElement *)element elementName:(NSString *)str
    {
        // 取出节点
        NSArray *strElementArr = [element elementsForName:str];
        // 从数组中取出节点的值
        GDataXMLElement *strElement = strElementArr[0];
        // 把节点中得值取出来
        NSString *string = strElement.stringValue;
        return string;
    }
    

JSON数据解析

Javascript Object Notation,轻量级的数据交换格式,采⽤完全独⽴于语⾔的⽂本格式,被称为理想的数据交换语⾔。

使用Foundation进行JSON解析

真谛:必须要知道Json文件的最外层是什么 []是数组 {}是字典

Teacher.json数据如图所示:

这里写图片描述

- (void)setUpJsondata
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSError *error = nil;
    // 把一个JSON的二进制文件转化成数组或者字典
    NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
}

使用JSONKit进行JSON解析

(还是上图)

- (void)setUpJsondata
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    // Jsonkit 解析数据
    NSArray *array = [data objectFromJSONData];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值