API(Application Programming Interface,应用程序编程接口)
XML: SAX
Dom
JSON: JSONSerialization
JSONKit
在引入第三方时要注意如何使用(使用方法一般都写在下载的网页中或者下载完成后的.h/.m文件中)
容器 —>三大集合(数组,字典,集合)
引入第三方报错(第三方写在mrc的) 将其修改为arc
在Header Search中添加下方文本
修改为arc机制
//
// ViewController.m
// Lesson16_解析
//
// Created by Floating_SH on 15/12/8.
// Copyright © 2015年SH. All rights reserved.
//
#import"ViewController.h"
#import "Student.h"
#import "GDataXMLNode.h"
#import "JSONKit.h"
@interface ViewController ()<NSXMLParserDelegate>
/**
* 一个可变数组,用来存储每次解析出来的model数据
*/
@property (nonatomic,strong)NSMutableArray *dataArray;
/**
* 不可变字符串,用来保存当前解析到的节点名称
*/
@property (nonatomic,strong)NSString *currentElement;
@end
@implementationViewController
#pragma mark --- JSON JSONKit解析---
//JSON JSONKit解析
- (IBAction)jsonkitParserAction:(id)sender {
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"JSONDocument"ofType:@"txt"];
//2.创建Data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.解析
NSArray *array = [data objectFromJSONData];
// NSLog(@"JSON JSONKit解析结果:%@",array);
//封装model
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
for (NSDictionary *dict in array) {
Student *student = [Studentnew];
[student setValuesForKeysWithDictionary:dict];
[self.dataArrayaddObject:student];
}
//验证model
for (Student *student in self.dataArray) {
NSLog(@"JSON JSONKit解析结果:%@",student);
}
}
#pragma mark --- JSON Foundation解析---
//JSON Foundation解析(最好使用系统自带的解析方法)
- (IBAction)jsonFoundationParserAction:(id)sender {
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"JSONDocument"ofType:@"txt"];
//2.创建Data对象(Data是二进制文件,计算机能读懂)
NSData *data = [NSData dataWithContentsOfFile:path];
//3.解析(NSJSONSerialization : 专门做JSON解析的,options NSJSONReadingAllowFragments(允许碎片):能最大限度的包容碎片)
NSArray *array = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragmentserror:nil];
// NSLog(@"JSON Foundation解析结果:%@",array);
//封装model
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
for (NSDictionary *dict in array) {
Student *student = [Studentnew];
[student setValuesForKeysWithDictionary:dict];
[self.dataArrayaddObject:student];
}
//验证model
for (Student *student in self.dataArray) {
NSLog(@"JSON Foundation解析结果:%@",student);
}
}
#pragma mark --- XML - DOM解析---
//xmlDOM解析
- (IBAction)xmlDomParserAction:(id)sender {
//1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"XMLDocument"ofType:@"txt"];
//2.创建Data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.创建解析对象
GDataXMLDocument*document = [[GDataXMLDocumentalloc]initWithData:dataoptions:0error:nil];
//4.获取根节点
GDataXMLElement*rootElement = [document rootElement];
//解析
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
//rootElement.children 根节点的子节点
//遍历根节点的子节点
for (GDataXMLElement *studentElement in rootElement.children) {
//根据子节点的个数来创建model
Student*student = [Studentnew];
//遍历子节点的子节点
for (GDataXMLElement *subElement in studentElement.children) {
//KVC赋值
[student setValue:subElement.stringValueforKey:subElement.name];
}
//将model对象添加到数组
[self.dataArrayaddObject:student];
}
//遍历打印
for (Student *s in self.dataArray) {
NSLog(@"XML_DOM解析结果:%@",s);
}
}
#pragma mark --- XML - SAX解析---
//xmlSax解析
- (IBAction)xmlSaxParserAction:(id)sender {
//采用协议回调机制(设置代理对象)
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"XMLDocument"ofType:@"txt"];
//2.创建data对象
NSData *data = [[NSData alloc]initWithContentsOfFile:path];
//3.创建解析对象
NSXMLParser*parser = [[NSXMLParseralloc]initWithData:data];
//4.设置代理
parser.delegate= self;
//5.开始解析
[parser parse];
}
#pragma mark -----协议回调机制解析数据步骤----
//1.开始解析文档
- (void)parserDidStartDocument:(NSXMLParser*)parser{
//给数组开辟空间
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
}
//2.开始解析标签
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary<NSString*,NSString*> *)attributeDict{
//获取当前标签名
self.currentElement= elementName;
//根据student标签来预存储model对象
if ([elementName isEqualToString:@"student"]) {
Student *student = [Studentnew];
[self.dataArrayaddObject:student];
}
}
//3.获取标签内容(真正赋值)
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string{
//取出数组中最后一个元素进行赋值操作
Student *student = [self.dataArraylastObject];
[student setValue:stringforKey:self.currentElement];//currentElement 标签名
}
//4.结束标签解析
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
//清0
self.currentElement= nil;
}
//下面两种可以不写(为了严谨还是写上)
//5.结束文档解析
- (void)parserDidEndDocument:(NSXMLParser*)parser{
//遍历,查询解析结果
for (Student *student in self.dataArray) {
NSLog(@"XML_SAX解析结果:%@",student);
}
}
//6.错误处理(写错时才会执行)
- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError{
NSLog(@"出错了,错误代码是%@",parseError);
// ViewController.m
// Lesson16_解析
//
// Created by Floating_SH on 15/12/8.
// Copyright © 2015年SH. All rights reserved.
//
#import"ViewController.h"
#import "Student.h"
#import "GDataXMLNode.h"
#import "JSONKit.h"
@interface ViewController ()<NSXMLParserDelegate>
/**
* 一个可变数组,用来存储每次解析出来的model数据
*/
@property (nonatomic,strong)NSMutableArray *dataArray;
/**
* 不可变字符串,用来保存当前解析到的节点名称
*/
@property (nonatomic,strong)NSString *currentElement;
@end
@implementationViewController
#pragma mark --- JSON JSONKit解析---
//JSON JSONKit解析
- (IBAction)jsonkitParserAction:(id)sender {
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"JSONDocument"ofType:@"txt"];
//2.创建Data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.解析
NSArray *array = [data objectFromJSONData];
// NSLog(@"JSON JSONKit解析结果:%@",array);
//封装model
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
for (NSDictionary *dict in array) {
Student *student = [Studentnew];
[student setValuesForKeysWithDictionary:dict];
[self.dataArrayaddObject:student];
}
//验证model
for (Student *student in self.dataArray) {
NSLog(@"JSON JSONKit解析结果:%@",student);
}
}
#pragma mark --- JSON Foundation解析---
//JSON Foundation解析(最好使用系统自带的解析方法)
- (IBAction)jsonFoundationParserAction:(id)sender {
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"JSONDocument"ofType:@"txt"];
//2.创建Data对象(Data是二进制文件,计算机能读懂)
NSData *data = [NSData dataWithContentsOfFile:path];
//3.解析(NSJSONSerialization : 专门做JSON解析的,options NSJSONReadingAllowFragments(允许碎片):能最大限度的包容碎片)
NSArray *array = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragmentserror:nil];
// NSLog(@"JSON Foundation解析结果:%@",array);
//封装model
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
for (NSDictionary *dict in array) {
Student *student = [Studentnew];
[student setValuesForKeysWithDictionary:dict];
[self.dataArrayaddObject:student];
}
//验证model
for (Student *student in self.dataArray) {
NSLog(@"JSON Foundation解析结果:%@",student);
}
}
#pragma mark --- XML - DOM解析---
//xmlDOM解析
- (IBAction)xmlDomParserAction:(id)sender {
//1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"XMLDocument"ofType:@"txt"];
//2.创建Data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.创建解析对象
GDataXMLDocument*document = [[GDataXMLDocumentalloc]initWithData:dataoptions:0error:nil];
//4.获取根节点
GDataXMLElement*rootElement = [document rootElement];
//解析
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
//rootElement.children 根节点的子节点
//遍历根节点的子节点
for (GDataXMLElement *studentElement in rootElement.children) {
//根据子节点的个数来创建model
Student*student = [Studentnew];
//遍历子节点的子节点
for (GDataXMLElement *subElement in studentElement.children) {
//KVC赋值
[student setValue:subElement.stringValueforKey:subElement.name];
}
//将model对象添加到数组
[self.dataArrayaddObject:student];
}
//遍历打印
for (Student *s in self.dataArray) {
NSLog(@"XML_DOM解析结果:%@",s);
}
}
#pragma mark --- XML - SAX解析---
//xmlSax解析
- (IBAction)xmlSaxParserAction:(id)sender {
//采用协议回调机制(设置代理对象)
//1.获取文件路径
NSString*path = [[NSBundlemainBundle]pathForResource:@"XMLDocument"ofType:@"txt"];
//2.创建data对象
NSData *data = [[NSData alloc]initWithContentsOfFile:path];
//3.创建解析对象
NSXMLParser*parser = [[NSXMLParseralloc]initWithData:data];
//4.设置代理
parser.delegate= self;
//5.开始解析
[parser parse];
}
#pragma mark -----协议回调机制解析数据步骤----
//1.开始解析文档
- (void)parserDidStartDocument:(NSXMLParser*)parser{
//给数组开辟空间
self.dataArray= [[NSMutableArrayalloc]initWithCapacity:6];
}
//2.开始解析标签
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary<NSString*,NSString*> *)attributeDict{
//获取当前标签名
self.currentElement= elementName;
//根据student标签来预存储model对象
if ([elementName isEqualToString:@"student"]) {
Student *student = [Studentnew];
[self.dataArrayaddObject:student];
}
}
//3.获取标签内容(真正赋值)
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string{
//取出数组中最后一个元素进行赋值操作
Student *student = [self.dataArraylastObject];
[student setValue:stringforKey:self.currentElement];//currentElement 标签名
}
//4.结束标签解析
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
//清0
self.currentElement= nil;
}
//下面两种可以不写(为了严谨还是写上)
//5.结束文档解析
- (void)parserDidEndDocument:(NSXMLParser*)parser{
//遍历,查询解析结果
for (Student *student in self.dataArray) {
NSLog(@"XML_SAX解析结果:%@",student);
}
}
//6.错误处理(写错时才会执行)
- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError{
NSLog(@"出错了,错误代码是%@",parseError);
}