XML_JSON

XML

SAX解析

  1. 创建XML解析对象
1
2
NSURL *url = [NSBundle mainBundle] URLForResource:@"bookstore" withExternsion:@"xml"];
NSXMLParser *parser = [][NSXMLParser alloc]initWithContentsOfURL:url];
  1. 设置XMLParser 对象的delegate
1
parser.delegate = self;
  1. 调用delegate的fangf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//当时开始解析的时候条用该方法,通常在这个方法里, 创建模型数组
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//当开始解析,遇到元素的开始标签时,回调用这个方法,通常在这个方法里,创建模型对象,或解析标签中得属性并保存在模型对象中
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//当解析到xml标签的文本内容时,回调用这个方法,通常在这个方法里,暂存解析到的文本内容
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//当解析xml内容遇到结束标签时,回调用这个方法,通常在这个方法里,需要将模型对象保存到数组中或把标签对应的文本内容解析出来,保存在模型对象中。(通过KVC赋值)
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
//当整个xml解析完成条用这个方法,可以完成其他操作
}

DOM解析

以下以GDataXMLNode为例:

1
2
3
4
5
6
7
8
9
* <节点> (GDataXMLNode)
* 根据 DOM,XML ⽂文档中的每个成分都是⼀一个节点。
* DOM 是这样规定的:
* 整个⽂文档是⼀一个⽂文档节点
* 每个 XML 标签是⼀一个元素节点
* 包含在 XML 元素中的⽂文本是⽂文本节点
* 每⼀一个 XML 属性是⼀一个属性节点
* 注释属于注释节点

  1. 导入第三方库
1
2
3
4
5
导入第三方库时,首先编译检查是否可用,(头文件是否编译通过,头文件是否需要导入头文件路径,是否使用非ARC环境)
1. 头文件编译未通过,添加文件搜索路径,头文件为系统头文件时:在Build setting下的Header Search Paths 添加/usr/include/libxml2
头文件为用户头文件时:在Build setting下的User Header Search Paths 添加/usr/include/libxml2
2. 在Build Phases 下的Link Binary With Libraries 添加libxml2.dylib,链接的动态库
3. 在Build Phases 下的Compile Sources 将导入的编译文件设置为非ARC 即添加 -fno-objc-arc即可
  1. 创建GDataXMLDocument对象
1
2
NSData *data = [[NSBundle mainBundle] URLForResource:@"bokstore" withExternsion:"xml"];
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
  1. 获取根元素rootElement
1
[document rootElement];
  1. 由根元素,可以获取到根元素下的子元素,以及对子元素的属性赋值;
1
2
3
4
5
6
获取子元素的方法:
- (NSArray *)elementsForName:(NSString *)name;
获取子元素属性的方法:
- (GDataXMLNode *)attributeForName:(NSString *)name;
将GDataXMLNode对象转换为NSString对象的方法:
- (NSString *)stringValue;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for (GDataXMLElement *element in elements) {
// 创建图书对象
YMBook *book = [[YMBook alloc] init];
// 根据属性名字,解析book元素的属性值
book.category = [[element attributeForName:kCategory]
stringValue];
// 解析book的⼦子元素包含的⽂文本内容及其⼦子元素的属性
[0];
GDataXMLElement *titleElement = [element elementsForName:kTitle]
book.title = [titleElement stringValue];
book.lang = [[titleElement attributeForName:kLanguage]
stringValue];
GDataXMLElement *authorElement = [element
elementsForName:kAuthor][0];
book.author = [authorElement stringValue];
GDataXMLElement *yearElement = [element elementsForName:kYear]
[0];
book.year = [yearElement stringValue];
GDataXMLElement *priceElement = [element elementsForName:kPrice]
[0];
book.price = [priceElement stringValue];
 [_bookStore addObject:book];
}

JSON

1.数据分类
从结构上看,所有的数据(data)最终都可以分解成三种类型:

    - 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字 (numbers),比如"北京"这个单独的词 

    - 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一 起,又叫做数组(array)或列表(List),比如"北京,上海" 

    - 第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个 名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比 如"首都:北京"

Douglas Crockford发明了JSON,Json的规定非常简单:

  1. 并列的数据之间用逗号(“, “)分隔

  2. 映射用冒号(“: “)表示

  3. 并列数据的集合(数组)用方括号(“[]”)表示

  4. 映射的集合(对象)用大括号(“{}”)表示

比如,下面这句话:

“”北京市的⾯面积为16800平⽅方公⾥里,常住⼈人⼜⼝口1600万⼈人。上海市的⾯面积为6400平⽅方 公⾥里,常住⼈人⼜⼝口1800万。”

写成JSON格式就是这样:

1
2
3
4
[
 {"城市":"北京","⾯面积":16800,"⼈人⼝口":1600},
 {"城市":"上海","⾯面积
]

如果事先知道数据的结构,上面的写法还可以进一步简化:

1
2
3
4
[
["北京",16800,1600],
["上海",6400,1800]
]

NSJSONSerialization

1
2
3
4
5
6
7
8
9
10
- 反序列
+ (id)JSONObjectWithData:(NSData *)data
error:(NSError **)error
options:(NSJSONReadingOptions)opt
error:(NSError **)error
- 序列化
+ (NSData *)dataWithJSONObject:(id)obj
options:(NSJSONWritingOptions)opt


JSONKit

  1. 需要导入第三方库

使用: -fno-objc-arc

序列化: NSArray NSDictionary NSString

1
2
3
4
5
6
7
8
9
10
11
12
JSONData
– JSONDataWithOptions:includeQuotes:error:
-
JSONDataWithOptions:serializeUnsupportedClassesUsingDelegate:selector:error:
- JSONDataWithOptions:serializeUnsupportedClassesUsingBlock:error:
– JSONString
– JSONStringWithOptions:includeQuotes:error:
-
JSONStringWithOptions:serializeUnsupportedClassesUsingDelegate:selector:erro
r:
– JSONStringWithOptions:serializeUnsupportedClassesUsingBlock:error:

反序列化:NSData NSString

1
2
3
4
5
6
7
8
9
10
11
12
13
– objectFromJSONData
– objectFromJSONDataWithParseOptions:
– objectFromJSONDataWithParseOptions:error:
– mutableObjectFromJSONData
– mutableObjectFromJSONDataWithParseOptions:
– mutableObjectFromJSONDataWithParseOptions:error:
– objectFromJSONString
– objectFromJSONStringWithParseOptions:
– objectFromJSONStringWithParseOptions:error:
– mutableObjectFromJSONString
– mutableObjectFromJSONStringWithParseOptions:
– mutableObjectFromJSONStringWithParseOptions:error: