iOS中XML、JSON数据结构解析以及第三方类的引用

今天讲到数据结构解析的内容:XML和JSON两种

XML数据结构:是扩展于HTML,主要使用标签对<start></start>

其解析有两种:

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

NSXMLParser是iOS自带的XML解析类。解析过程由NSXMLParserDelegate协议方式回调

解析过程:开始标签-->取值-->结束标签-->取值

使用过程如下:

@interface TableViewController ()<NSXMLParserDelegate>

@property (nonatomic,retain) NSMutableArray *datasource;

@property (nonatomic,retain) NSString *startTag;//通过属性暂存起始标签

@end

NSXMLParser *aParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"]]];              //1.创建对象

aParser.delegate = self;  //2.指定代理对象

[aParser parse];            //3.开始解析

[aParser release];         //4.释放所有权

其中主要实现的协议方法有以下五种

- (void)parserDidStartDocument:(NSXMLParser *)parser;//解析器开始解析XML文本,通知代理对象解析器解析的起始时间点

- (void)parserDidEndDocument:(NSXMLParser *)parser;//解析器完成解析时,通知代理对象解析的结束时间点

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;//当解析器得到起始标签时会调用该协议方法传递数值给代理对象

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;//当解析器得到结束标签时会调用该协议方法传递数值给代理对象

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;//当解析器得到节点的起始标签和结束标签之间的数据时会调用该协议方法传数据给代理对象

2.DOM解析(文档对象模型):谷歌的GDataXMLNode(是一个第三方类的使用)

解析时需要将xml文件整体读入,并且将XML结构化树状,使用时在通过树种结构读取相关数据

//获取整个文档

GDataXMLDocument *aDocument = [[GDataXMLDocument alloc] initWithXMLString:[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"] encoding:NSUTF8StringEncoding error:nil] options:0 error:nil];

GDataXMLElement *rootElement = [aDocument rootElement]; //获取根节点对象

NSArray *subElements = [rootElement elementsForName:@"student"];//获取子节点数组

//通过快速枚举获取每一个子节点对象

for (GDataXMLElement *anElement in subElements) {

Student *aStudent = [[Student alloc] init];(Student是自定义模型类)

NSString *name = [[[anElement elementsForName:@"name"] firstObject] stringValue];

aStudent.name = name;

NSLog(@"%@",[[anElement elementsForName:@"gender"] firstObject]);

NSString *gender = [[[anElement elementsForName:@"gender"] firstObject] stringValue];

aStudent.gender = gender;

int age = [[[[anElement elementsForName:@"age"] firstObject]stringValue] intValue];

aStudent.age = age;

[self.datasource addObject:aStudent];//将获取的每一个Student对象存放在datasource

[aStudent release];

}

JSON数据结构:轻量级的数据交换格式

JSON?文档有两种结构:对象、数据

对象:以“{”开始,以“}”结束,是“名称/值”对?儿的集合。名称和值中 间?用“:”隔开。多个“名称/值”对之间?用“,”隔开。类似OC中的字典。

数组:以“[”开始,以“]”结束,中间是数据。数据以“,”分隔。

JSON中的数据类型:字符串、数值、BOOL、对象、数组。

//使用系统自带的JSOM序列化类进行JSON解析

NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Students" ofType:@"json"]];

NSMutableArray *elements = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];

for (NSDictionary *dict in elements)

{

Student *aStudent = [[Student alloc] init];

aStudent.name = dict[@"name"];

aStudent.age = [dict[@"age"] intValue];

aStudent.gender = dict[@"gender"];

[self.datasource addObject:aStudent];

[aStudent release];

}

以上,JSON使用最频繁,结构简单,所占空间最少,序列化解析方法简洁方;而XML文档所占空间是json文件两倍还多,其两种解析方法中:SAX解析是逐行解析,当.xml文件中存在错误时也可以将之前的解析完成,,但是采用协议回调的方法,太过于复杂;而DOM没有使用协议回调的方法,但是将整篇文档读入后解析,一旦文档编辑出错,将无法解析,但是可以定位文档出错的位置

文章中提到的第三方类的使用:

获取地址:http://github.com

将获取到的类拖到工程中,会出现头文件导入错误的信息

// libxml includes require that the target Header Search Paths contain

//   /usr/include/libxml2

// and Other Linker Flags contain

//   -lxml2

#import <libxml/tree.h>//导入错误

处理方法:

点击‘+’

添加该文件后。在Bulid settings-->search Paths -->Header Search Paths将路径/usr/include/libxml2添加到两个路径的后面

时间: 2024-12-14 18:43:08

iOS中XML、JSON数据结构解析以及第三方类的引用的相关文章

iOS开发——XML/JSON数据解析

除了XML和Json,文中还涉及到的一些知识:第三方类库的使用,获取本地文件内容,网站API使用,GCD多线程编程,不做详细介绍,在代码出现的地方会注明. 先安利一波: Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特定的数据结构,必须对其进行解析,得到我们可以处理的数据.所谓“解析”,就是从事先规定好的格式串中提取数据.解析的前提是数据的提供方

iOS开发笔记3:XML/JSON数据解析

这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSerialization. 1.XML解析之NSXMLParser NSXMLParser是iOS原生的XML解析方式,采用SAX方式进行解析,特点是解析的时候从根元素开始,按顺序依次对每一个元素进行解析. 以下图所示XML文档为例进行解析 (1)首先是实例化一个NSXMLParser,设置代理监听解析过

iOS 中 XML 数据交换格式

     XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 XML 来描述包的依赖关系等,当然还有很多了.      对于 XML 文档操作包括了"读"与"写",读入 XML 文档并分析的过程称为"解析" XML 文档,"解析" XML 文档在实际开发中是占很大比重的.      读写

Silverlight项目笔记7:xml/json数据解析、MVVM下实现多级树形结构TreeView、忽视引用类型导致数据绑定错误、通过流或动态空间加载图片、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

涉及的内容主要有: 1.xml/json数据解析 2.多级树形结构TreeView 3.忽视引用类型导致数据绑定错误 4.通过流或动态空间加载图片 5.虚拟目录设置 6.silverlight安全机制引发的问题 7.webclient缓存问题 1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应节点的数据集合,再通过Element这个方法对数据集合进

[转]iOS中UITextField 使用全面解析

001//初始化textfield并设置位置及大小002  UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];003  004//设置边框样式,只有设置了才会显示边框样式 005  text.borderStyle = UITextBorderStyleRoundedRect;006 typedef enum {007    UITextBorderStyleNone,008   

php中 xml json 数组 之间相互转换

php中 xml json  数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, 'data'=>$data, ); json_encode($result);

UI_16 XML、JSON数据结构解析

从事先规定好的格式中提取数据,即为解析.iOS开发常见的解析有:XML解析.JSON解析 一.XML解析 XML:Extensible Markup language(可扩展标记语?),主流数 据格式之?,可以?来存储和传输数据. XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.TinyXML和GDataXML.如何选择? 以下几点摘自iOS平台XML解析类库对比和安装说明

XML、JSON数据结构解析

一.XML的解析 XML的解析分为SAX解析和DOM解析,DOM解析又分为根节点解析和叶子节点解析. 1.SAX解析步骤 a.获取XML数据存储的文件路径(假如XML文件为Students.xml) NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"xml"]; b.创建解析对象 //创建二进制数据对象 NSData *data = [NSData data

android中xml的pull解析

xml的pull解析:    //类加载器加载xml文件 InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("weather.xml"); //生成xml的pull解析器 XmlPullParser pull = Xml.newPullParser(); try { //设置输入流 pull.setInput(is, "utf-8"); //解析器当前处于的状态 int