一. XML的SAX解析
1).SAX解析
1. 遵守协议
@interface
RootViewController
()<
NSXMLParserDelegate
>
2. 声明属性
//
声明一个属性
可变数组
存放
model
@property
(
nonatomic
,
retain
)
NSMutableArray
*dataArray;
//
需要声明一个
model
的属性
@property
(
nonatomic
,
retain
)
StudentModel
*model;
//
声明一个字符串
用来保存数据的内容
@property
(
nonatomic
,
retain
)
NSString
*str;
3.
NSXMLParser
分析
XML
文件
- (
void)setUpDataXMLParser
{
* XML 的 SAX 解析
// Path
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建一个分析人 类
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
// 设置代理
parser.delegate = self;
// 解析数据(开始分析) 利用代理协议方法 进行数据分析
[parser parse];
// 我在这里释放 行不行???
NSLog(@"我在这里释放 行!");
// 内存管理
[parser release];
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建一个分析人 类
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
// 设置代理
parser.delegate = self;
// 解析数据(开始分析) 利用代理协议方法 进行数据分析
[parser parse];
// 我在这里释放 行不行???
NSLog(@"我在这里释放 行!");
// 内存管理
[parser release];
}
4.
*1.
把数据取出来
*2.
装进
Model
*3.
把
Model
装进数组
备用
#pragma mark -- NSXMLParser代理方法
- (
void
)parserDidStartDocument:(
NSXMLParser
*)parser
{
NSLog ( @" 开始分析文件 " );
// 初始化数组
self . dataArray = [ NSMutableArray array ];
}
// 找节点
- ( void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary *)attributeDict
{
// NSLog(@" 开始遇到节点 ");
NSLog ( @"<%@>" , elementName);
// 初始化 model
if ([elementName isEqualToString : @"Student" ]) {
self . model = [[ StudentModel alloc ] init ];
}
}
- ( void )parser:( NSXMLParser *)parser foundCharacters:( NSString *)string
{
// NSLog(@" 发现字符触发 ");
NSLog ( @"%@" , string);
self . str = string;
}
- ( void )parser:( NSXMLParser *)parser didEndElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName
{
// NSLog(@" 遇到节点结束触发 ");
NSLog ( @"</%@>" , elementName);
if ([elementName isEqualToString : @"name" ]) {
self . model . name = self . str ;
} else if ([elementName isEqualToString : @"gender" ]) {
self . model . gender = self . str ;
} else if ([elementName isEqualToString : @"age" ]) {
self . model . age = self . str ;
} else if ([elementName isEqualToString : @"motto" ]) {
self . model . motto = self . str ;
} else if ([elementName isEqualToString : @"Student" ]) {
// 节点名等于 Student 的时候 一个 model 就赋值完成了 这时候 装进数组里
[ self . dataArray addObject : self . model ];
[ _model release ];
}
{
NSLog ( @" 开始分析文件 " );
// 初始化数组
self . dataArray = [ NSMutableArray array ];
}
// 找节点
- ( void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary *)attributeDict
{
// NSLog(@" 开始遇到节点 ");
NSLog ( @"<%@>" , elementName);
// 初始化 model
if ([elementName isEqualToString : @"Student" ]) {
self . model = [[ StudentModel alloc ] init ];
}
}
- ( void )parser:( NSXMLParser *)parser foundCharacters:( NSString *)string
{
// NSLog(@" 发现字符触发 ");
NSLog ( @"%@" , string);
self . str = string;
}
- ( void )parser:( NSXMLParser *)parser didEndElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName
{
// NSLog(@" 遇到节点结束触发 ");
NSLog ( @"</%@>" , elementName);
if ([elementName isEqualToString : @"name" ]) {
self . model . name = self . str ;
} else if ([elementName isEqualToString : @"gender" ]) {
self . model . gender = self . str ;
} else if ([elementName isEqualToString : @"age" ]) {
self . model . age = self . str ;
} else if ([elementName isEqualToString : @"motto" ]) {
self . model . motto = self . str ;
} else if ([elementName isEqualToString : @"Student" ]) {
// 节点名等于 Student 的时候 一个 model 就赋值完成了 这时候 装进数组里
[ self . dataArray addObject : self . model ];
[ _model release ];
}
}
- (
void
)parserDidEndDocument:(
NSXMLParser
*)parser
{
NSLog ( @" 已经结束分析文件 " );
{
NSLog ( @" 已经结束分析文件 " );
NSLog(@"%@", self.dataArray);
}
2).DOM解析 (关于文件详细配置及其他 请查阅
GDataXMLNode.m)
1.
使用GDataXmlNode 这个类库 来实现
直接导入类库 会报错 报错的原因 : GDataXmlNode 基于libxml 来写的
必须把libxml 导入
2.
- (void)setUpDataGDataXmlNode
{
// 创建路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 利用XMLNode类 进行DOM 解析
// NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 利用XMLNode类 进行DOM 解析
// 用data 初始化管理文件 的对象 转化成树形结构 error 如果解析失败的话可以打印出理由
// 创建空的错误信息
NSError *error = nil;
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
// 获取根节点
GDataXMLElement *rootElement = [document rootElement];
// 从根节点开始打印 把所有的东西都打印出来了
NSLog(@"%@", rootElement);
// 获取根节点下Student节点
NSArray *Studentrray = [rootElement elementsForName:@"Student"];
NSLog(@"%@", Studentrray);
// 遍历Student节点的数组
self.dataArray = [NSMutableArray array];
for (int i = 0; i < Studentrray.count; i++) {
// 取出每一个学生节点
GDataXMLElement *oneStudentElement = Studentrray[i];
// 取出oneStudentElement 节点下的name 数组
NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
// 取出name 节点
GDataXMLElement *nameElement = nameArray [0];
// 转化为字符串
NSString *name = [nameElement stringValue];
NSLog(@"%@", name);
NSString *gender = [self backStringWithElement:oneStudentElement Forname:@"gender"];
NSLog(@"%@", gender);
NSString *age = [self backStringWithElement:oneStudentElement Forname:@"age"];
NSLog(@"%@", age);
NSString *motto = [self backStringWithElement:oneStudentElement Forname:@"motto"];
NSLog(@"%@", motto);
// 给Model 赋值初始化一个model
StudentModel *model = [[StudentModel alloc]init];
model.name = name;
model.gender = gender;
model.age = age;
model.motto = motto;
[self.dataArray addObject:model];
[model release];
}
NSLog(@"%@", self.dataArray);
}
// 将取出名字的方法封装起来
- (NSString *)backStringWithElement:(GDataXMLElement *)element Forname:(NSString *)name
{
NSArray *array = [element elementsForName:name];
GDataXMLElement *element1 = array [0];
return [element1 stringValue];
NSError *error = nil;
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
// 获取根节点
GDataXMLElement *rootElement = [document rootElement];
// 从根节点开始打印 把所有的东西都打印出来了
NSLog(@"%@", rootElement);
// 获取根节点下Student节点
NSArray *Studentrray = [rootElement elementsForName:@"Student"];
NSLog(@"%@", Studentrray);
// 遍历Student节点的数组
self.dataArray = [NSMutableArray array];
for (int i = 0; i < Studentrray.count; i++) {
// 取出每一个学生节点
GDataXMLElement *oneStudentElement = Studentrray[i];
// 取出oneStudentElement 节点下的name 数组
NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
// 取出name 节点
GDataXMLElement *nameElement = nameArray [0];
// 转化为字符串
NSString *name = [nameElement stringValue];
NSLog(@"%@", name);
NSString *gender = [self backStringWithElement:oneStudentElement Forname:@"gender"];
NSLog(@"%@", gender);
NSString *age = [self backStringWithElement:oneStudentElement Forname:@"age"];
NSLog(@"%@", age);
NSString *motto = [self backStringWithElement:oneStudentElement Forname:@"motto"];
NSLog(@"%@", motto);
// 给Model 赋值初始化一个model
StudentModel *model = [[StudentModel alloc]init];
model.name = name;
model.gender = gender;
model.age = age;
model.motto = motto;
[self.dataArray addObject:model];
[model release];
}
NSLog(@"%@", self.dataArray);
}
// 将取出名字的方法封装起来
- (NSString *)backStringWithElement:(GDataXMLElement *)element Forname:(NSString *)name
{
NSArray *array = [element elementsForName:name];
GDataXMLElement *element1 = array [0];
return [element1 stringValue];
}
二.JSON解析
1).
Json
解析
- (
void)setUpJson
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 把data 转化成可变数组或者可变字典 是字典还是数组 要看json 最外层是什么.
// 使用 jsonKit 来解析数据
//NSMutableArray *jsonArray =[data objectFromJSONData];
// NSJSONSerialization json解析使用的类
NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
// 剥香蕉
self.dataArray = [NSMutableArray array];
for (NSDictionary *dic in dataArray) {
TeacherModel *model = [[TeacherModel alloc]init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArray addObject:model];
[model release];
}
NSLog(@"%@", self.dataArray);
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 把data 转化成可变数组或者可变字典 是字典还是数组 要看json 最外层是什么.
// 使用 jsonKit 来解析数据
//NSMutableArray *jsonArray =[data objectFromJSONData];
// NSJSONSerialization json解析使用的类
NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
// 剥香蕉
self.dataArray = [NSMutableArray array];
for (NSDictionary *dic in dataArray) {
TeacherModel *model = [[TeacherModel alloc]init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArray addObject:model];
[model release];
}
NSLog(@"%@", self.dataArray);
}
2)
. - (void)setUpdata
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
self.dataArray = [NSMutableArray array];
for (NSDictionary *dic in jsonArray) {
CityModel *model = [[CityModel alloc]init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArray addObject:model];
NSLog(@"%@", model.province);
[model release];
}
NSLog(@"%@", self.dataArray );
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
self.dataArray = [NSMutableArray array];
for (NSDictionary *dic in jsonArray) {
CityModel *model = [[CityModel alloc]init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArray addObject:model];
NSLog(@"%@", model.province);
[model release];
}
NSLog(@"%@", self.dataArray );