UI第十五天:XML、JSON数据结构解析

⼀、解析的基本概念
所谓“解析”:从事先规定好的格式中提取数据
解析的前提:提前约定好格式、数据提供⽅按照格式提供数据、 数据获取⽅则按照格式获取数据
iOS开发常⻅的解析:XML解析、JSON解析





⼆、XML数据结构
XML:Extensible Markup language(可扩展标记语⾔),主流数 据格式之⼀,可以⽤来存储和传输数据。

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

声明
节点使⽤⼀对标签表⽰。起始和结束标签。
根节点是起始节点,只有⼀个。节点可以嵌套。
节点可以有值。存储在⼀对⼉标签中。


三、JSON数据结构
Javascript Object Notation,轻量级的数据交换格式,采⽤完全 独⽴于语⾔的⽂本格式,被称为理想的数据交换语⾔
JSON⽂档有两种结构:对象、数据
对象:以“{”开始,以“}”结束,是“名称/值”对⼉的集合。名称和值中 间⽤“:”隔开。多个“名称/值”对之间⽤“ , ”隔开。类似OC中的字典。
数组:以“[”开始,以“]”结束,中间是数据。数据以“ , ”分隔。
JSON中的数据类型:字符串、数值、BOOL、对象、数组。





四、XML与JSON两种数据结构的优缺点
//解析xml数据(SAX解析)
-(
void)xmlParserUpData
{
   
//利用系统的NSXMLParser
   
//xml分析
   
//以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)
   
//真谛:逐行解析
   
   
//创建分析人
   
//获取xml文件路径
   
NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
   
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:[NSData dataWithContentsOfFile:path]];
   
//驱动事件(设置代理)
    parser.
delegate = self;
   
   
//开始分析
    [parser
parse];
   
//释放
    [parser
release];
}
#pragma mark -- 代理方法
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
   
//初始化数组保存model
   
self.arr = [NSMutableArray array];
   
NSLog(@"已经开始分析文件");
}


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

   
if ([elementName isEqualToString:@"Student"]) {
        [
self.arr addObject:self.model];
        [
self.model release];
    }
else
    {
        [
self.model setValue:self.str forKey:elementName];
    }
   
}
-(
void)parserDidEndDocument:(NSXMLParser *)parser
{
   
NSLog(@"已经结束文件分析");
}

// Dom 解析 依靠第三方类库 GDataXMLNode
// GDataXMLNode 依靠系统的 libxml2 来实现
// 使用的时候 需要导入 libxml2 框架
    设置Header Search paths      /usr/include/libxml2 
// 真谛 : 把所有的节点一次性读取 并转化为 树形结构 整体解析 ( SAX 解析对比 )
//-(void)GDataXMLNodeUpData
//{
//    NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
//    // 创建一个空的错误对象
//    NSError *error = nil;
//   
//
//    // 初始化文件对象
//    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:[NSData dataWithContentsOfFile:path] options:0 error:&error];
//    // 获取根节点
      //逐层剥去不能跳步
//    GDataXMLElement *rootelement = doc.rootElement;
//    // 获取根节点下 student
//    NSArray *arr = [rootelement elementsForName:@"Student"];
//    self.dataArray = [NSMutableArray array];
//    // 遍历数组 对每一个 Student 节点 继续化整为零
//    for (GDataXMLElement *element in arr) {
//       NSString *name =[self test:element elementname:@"name"];
//       NSString *gender =  [self test:element elementname:@"gender"];
//       NSString *age =  [self test:element elementname:@"sex"];
//       NSString *motto =  [self test:element elementname:@"motto"];
//        Student *model = [[Student alloc]init];
//        model.name = name;
//        model.gender =gender;
//        model.age= age;
//        model.motto =motto;
//        [self.dataArray addObject:model];
//        [model release];
//    }
//}
// 1. 找爆红的对象 ( 是方法没有的 需要外界传进来 )
// 2. 找可变的对象 ( 例如 name 也是需要传递的 )
// 选好返回值

/ 解析 json 数据
// 真谛 : 必须要指定 json 文件的最外层是什么
// [] 数组 {} 字典
//JSONKIT 解析数据
   
NSString *path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"json"];
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
//jsonKit 解析
   
NSMutableArray *arr = [data objectFromJSONData];
     self.arr = [NSMutableArray array];
    //json 解析
//    NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutableContainers error:nil];
    for (NSDictionary *one in arr) {
       
City *model = [[City alloc]init];
        [model
setValuesForKeysWithDictionary:one];
        [
self.arr addObject:model];
        [model
release];
    }


五、进⾏XML数据结构解析时使⽤到的SAX⼯具,DOM⼯具
SAX:Simple API for XML。基于事件驱动的解析⽅式,逐⾏解析 数据。(采⽤协议回调机制)
NSXMLParser是iOS⾃带的XML解析类。采⽤SAX⽅式解析数据。
解析过程由NSXMLParserDelegate协议⽅法回调
解析过程:开始标签->取值->结束标签->取值

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

GDataXMLNode是Google提供的开源XML解析类,对 libxml2.dylib进⾏了Objective-C的封装
采⽤DOM⽅式解析数据
iOS中包含⼀个C语⾔的动态链接库libxml2.dylib,解析速度⽐ NSXMLParser快

六、进⾏JSON数据结构解析时使⽤到的第三⽅框架
NSJSONSerialization对象的作⽤
JSONDecoder对象的作⽤
NSString(JSONKitDeserializing)类⺫的作⽤
NSData(JSONKitDeserializing)类⺫的作⽤
NSString(JSONKitSerializing)类⺫的作⽤
NSArray(JSONKitSerializing)类⺫的作⽤
NSDictionary(JSONKitSerializing)类⺫的作⽤

总结

数据解析:从某种格式的数据中提取⾃⼰所需要的数据。
主流的数据交换格式有两种:XML和JSON
XML解析分为两种:SAX解析和DOM解析 XML解析⼯具:NSXMLParser、GDataXMLNode、TochXML和KissXML等
JSON解析⼯具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON 等,其中NSJSONSerialization是系统提供的解析类,其解析效率是最⾼的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值