Day 15
XML
Student.xml
<?xml version ="1.0" encoding="UTF-8" ?>
<students>
<student>
<name>gold one</name>
<age>74</age>
<gender>mu</gender>
</student>
<student>
<name>gold two</name>
<age>73</age>
<gender>gong</gender>
</student>
<student>
<name>gold three</name>
<age>67</age>
<gender>mu</gender>
</student>
</students>
SAX:
1. 容错性
2. 逐行读取,不一次性获取全部
3. 可以控制过程
4. (基于事件驱动的)
DOM:
1. 全部读取
2. 写起来方便
3. 将XML结构化成树状
sax解析
XMLViewController.m
#pragma mark - sax解析方式
- (IBAction)saxButtonAction:(UIButton *)sender
{
// 1. 获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 2. 使用NSData去接受
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSLog(@"%@", data);
// 3. 创建解析对象
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:data] autorelease];
// 3.1 设置代理
parser.delegate = self;
// 4. 开始解析
[parser parse];
}
#pragma mark 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// 1. 创建数组
self.allDataArray = [NSMutableArray array];
}
#pragma mark 开始解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 2. 保存当前标签
_currentElementStr = elementName;
// 3. 判断当前标签是否属Stedent
if ([elementName isEqualToString:@"student"]) {
// 创建并添加
Student *stu = [[Student new] autorelease];
[_allDataArray addObject:stu];
}
}
#pragma mark 获取值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 4. 获取接受值的对象
Student *stu = _allDataArray.lastObject;
if ([_currentElementStr isEqualToString:@"name"]) {
stu.name = string;
} else if([_currentElementStr isEqualToString:@"age"]) {
stu.age = string;
} else if ([_currentElementStr isEqualToString:@"gender"]) {
stu.gender = string;
}
}
#pragma mark 结束解析标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
_currentElementStr = nil;
}
#pragma mark 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"%@", _allDataArray);
}
dom解析
- (IBAction)domButtonAction:(UIButton *)sender
{
// 1. 获取路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 2. 获取数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3. 创建解析对象
GDataXMLDocument *document = [[[GDataXMLDocument alloc] initWithData:data options:0 error:nil] autorelease];
// 4. 获取根节点
GDataXMLElement *rootElement = document.rootElement;
// 5. 创建大数组
self.allDataArray = [NSMutableArray array];
// 6. 遍历根节点下的所有子节点
for (GDataXMLElement *stuElement in rootElement.children) {
// 7. 有多少个student节点,就创建多少个stu对象
Student *stu = [Student new];
// 8. 遍历student节点下的子节点
for (GDataXMLElement *subStuElement in stuElement.children) {
// 9. 通过KVC的方式将name/age/gender节点中的值赋给stu对象
[stu setValue:subStuElement.stringValue forKey:subStuElement.name];
}
// 10. 将创建好的stu添加到大数组中
[_allDataArray addObject:stu];
[stu release];
}
// 11. 打印值
NSLog(@"%@", _allDataArray);
}
JSON
(十分之九)
Student.json
[
{
"name":"jinyi",
"age":12,
"gender":"ci"
},
{
"name":"jinwu",
"age":17,
"gender":"xiong"
},
{
"name":"qinshu",
"age":12,
"gender":"男"
}
]
JSONViewController.m
- (IBAction)systemButtonAction:(UIButton *)sender
{
// 1. 获取路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student.json" ofType:nil];
// 2. 获取数据
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
// 3. 解析
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", arr);
}
jsonKit
#pragma mark 第三方
- (IBAction)otherButtonAction:(UIButton *)sender
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student.json" ofType:nil];
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
NSArray *resultDict = [data objectFromJSONData];
// 4.转化成json格式
NSString *jsonStr = [resultDict JSONString];
NSLog(@"%@", resultDict);
NSLog(@"%@", jsonStr);
}
JSON & XML 的区别
- JSON占用空间少
- XML易读,JSON不易读
- 对于解析来说,JSON的难度为0
- JSON轻量级,也是最常用的一种格式
- XML特点是标签,没有类型,全都是字符串
- JSON有:数组、对象、字符串、数字、BOOL。。。