UI基础-XML、JSON 数据结构解析

来源:互联网 发布:ps切片淘宝上传有缝隙 编辑:程序博客网 时间:2024/06/05 23:58

解析的基本概念

所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式、数据提供方按照格式提供数据、
数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析、JSON解析

XML数据结构

XML基本概念

XML:Extensible Markup language(可扩展标记语言),主流数 据格式之一,可以用来存储和传输数据。

XML数据格式的功能

数据交换
内容管理
用作配置文件

XML数据结构的语法

声明
节点使用一对标签表示。起始和结束标签。
根节点是起始节点,只有一个。节点可以嵌套。
节点可以有值。存储在一对儿标签中。
这里写图片描述
这里写图片描述

进行XML解析式使用到的SAX工具

SAX解析

SAX:Simple API for XML。
基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)

NSXMLParser类

NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据。
解析过程由NSXMLParserDelegate协议方法回调
解析过程:开始标签->取值->结束标签->取值

例题:

新建工程,Appdelegate中

RootViewController *rootVC = [[RootViewController alloc] init];    UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:rootVC];    self.window.rootViewController = navC;    [navC release];    [rootVC release];

根视图控制器中,解析XML数据

- (void)xmlParserUpData{    // 利用的是系统的 NSXMLParser    // xml 分析人 类    // 以驱动事件循环进行xml的解析(利用触发的代理方法解析)    // 真谛:逐行解析    // 获取路径    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    // 创建要分析的data(二进制对象)    NSData *data = [NSData dataWithContentsOfFile:path];    // 创建分析人    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];    // 驱动事件(设置代理)    parser.delegate = self;    // 开始分析    [parser parse];    // 释放    [parser release];}

这里写图片描述

创建StudentModel

// StudentModel.h中,声明属性与xml文件中一致@property (nonatomic, retain) NSString *name;@property (nonatomic, retain) NSString *gender;@property (nonatomic, retain) NSString *age;@property (nonatomic, retain) NSString *motto;
// StudentModel.m中- (void)dealloc{    [_name release];    [_gender release];    [_age release];    [_motto release];    [super dealloc];}- (void)setValue:(id)value forUndefinedKey:(NSString *)key{}

实现代理方法

- (void)parserDidStartDocument:(NSXMLParser *)parse{    NSLog(@"已经开始分析文件.....");    self.dataArr = [NSMutableArray array];}- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    NSLog(@"<%@>", elementName);    // 遇到Student节点初始化model    if ([elementName isEqualToString:@"Student"]) {      self.model = [[StudentModel alloc] init];    }   //NSLog(@"已经遇到开始节点.....");}- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    NSLog(@"%@", string);    // 保存字符串    self.string = string;   //NSLog(@"发现字符.....");}- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    NSLog(@"</%@>", elementName);    // 对model进行赋值    if ([elementName isEqualToString:@"name"]) {        self.model.name = self.string;    } else if ([elementName isEqualToString:@"gender"]){        self.model.gender = self.string;    } else if ([elementName isEqualToString:@"age"]){        self.model.age = self.string;    } else if ([elementName isEqualToString:@"motto"]){        self.model.motto = self.string;    } else if ([elementName isEqualToString:@"Student"]){        // 装进数组里        [self.dataArr addObject:self.model];        [self.model release];    }    //NSLog(@"已经遇到结束节点.....");}- (void)parserDidEndDocument:(NSXMLParser *)parser{    // 这时装完所有的model    NSLog(@"%@", self.dataArr);    NSLog(@"已经结束分析文件.....");}

进行XML解析式使用到的DOM工具

DOM解析

DOM:Document Object Model(文档对象模型)。
解析时需要
将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据

GDataXMLNode

GDataXMLNode是Google提供的开源XML解析类,对
libxml2.dylib进行了Objective-C的封装。
采用DOM方式解析数据。
iOS中包含一个C语⾔言的动态链接库libxml2.dylib,解析速度比 NSXMLParser快。

例题:

导入libxml2框架

这里写图片描述
这里写图片描述

新建工程,在Appdelegate中(同上)

在根视图控制器中,进行DOM解析

// Dom解析 依靠第三方类库GDataXMLNode// GDataXMLNode类 依靠系统的libxml2 来实现// 使用的时候 需要导入libxml2 框架// 真谛:把所有的节点一次性读取 并转化为 树形结构  整体解析(与SAX解析的区别)- (void)GDataXMLNodeUpData{    // 获取路径    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    // 转化成二进制对象    NSData *data = [NSData dataWithContentsOfFile:path];    // 创建一个错误对象    NSError *error = nil;    // 初始化文件对象    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];    // 获取根节点    GDataXMLElement *rootElement = [document rootElement];    // NSLog(@"%@", [rootElement stringValue]);    // 获取根节点下 student节点    NSArray *elementArr = [rootElement elementsForName:@"Student"];    // NSLog(@"%@", elementArr);    // 初始化数组保存model    self.dataArr = [NSMutableArray array];    // 遍历数组 对每一个Student节点 继续化整为零    for (GDataXMLElement *element in elementArr) {        StudentModel *model = [[StudentModel alloc] init];       model.name = [self getElementFromArr:element elementName:@"name"];       model.gender = [self getElementFromArr:element elementName:@"gender"];       model.age = [self getElementFromArr:element elementName:@"age"];       model.motto = [self getElementFromArr:element elementName:@"motto"];        // 装进数组        [self.dataArr addObject:model];        [model release];    }}// 1. 找报红得对象(是方法里面没有的 需要外界传进来)// 2. 找可变的对象 (例如name等 这个 也是需要传进来的)// 3. 选好返回值- (NSString *)getElementFromArr:(GDataXMLElement *)element elementName:(NSString *)elementName{    // 取出name节点    NSArray *nameElementArr = [element elementsForName:elementName];    // 从数组中取出name节点    GDataXMLElement *nameElement = nameElementArr[0];    // 把节点中的值 取出来    NSString *name = [nameElement stringValue];    return name;}

JSON数据结构

JSON数据结构的概念

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

JSON数据结构的语法

JSON文档有两种结构:对象、数据。
对象:以“{”开始,以“}”结束,是“名称/值”对儿的集合。名称和值中 间⽤用“:”隔开。多个“名称/值”对之间用“,”隔开。类似OC中的字典。
数组:以“[”开始,以“]”结束,中间是数据。数据以“,”分隔。 JSON中的数据类型:字符串、数值、BOOL、对象、数组。
这里写图片描述
这里写图片描述

JSON数据结构的功能

数据交换
内容管理
配置⽂文件

使用Foundation进行JSON解析

NSJSONSerialization

// 解析Jason数据// 真谛:必须要知道 json文件的最外层是什么// [ ]是数组 { }是字典- (void)setUpJasonData{    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];    NSData *data = [NSData dataWithContentsOfFile:path];    NSError *error = nil;    // 把jsonde二进制文件 转化成 数组 或者 字典    NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];}

使用JSONKit进行JSON解析

JSONDecoder对象的作用
NSString(JSONKitDeserializing)类目的作用 NSData(JSONKitDeserializing)类目的作用 NSString(JSONKitSerializing)类目的作用 NSArray(JSONKitSerializing)类目的作用 NSDictionary(JSONKitSerializing)类目的作用

- (void)setUpJasonData{    NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];    NSData *data = [NSData dataWithContentsOfFile:path];   // jsonkit 解析数据    NSArray *arr = [data objectFromJSONData];}
0 0
原创粉丝点击