IOS学的容易--XML的SAX解析
2015-09-16 13:19
369 查看
//XML的SAX解析
// NSXMLParser
分析XML文件
- (void)setUpDataXMLParser
{
// 3.
创建路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
// 2. NSData存储数据,以二进制形式存储
NSData *data = [NSDatadataWithContentsOfFile:path];
// 1.
创建一个分析人 类
NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data];
//
设置代理
parser.delegate =
self;
//
开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate)
[parser parse];
//
释放分析人
[parser release];
NSLog(@"我在这里释放行吗?");
}
/**
* 执行顺序:
1. 开始分析: [parser parse];
// 开始代理方法的实现
1. 开始分析文件
2. 开始遇到节点
3. 发现字符
4. 结束遇到节点
5. 结束分析文件
*/
/***************************************************************/
/**
* 把XML数据保存到model需要的操作
1. 把数据取出来
2. 装进model
3. 把model装进数组,备用
1. 从什么位置初始化数组:开始分析文件位置
2. 从什么位置初始化model:开始遇到节点
// 从什么位置可以拿出数据: 4.发现字符
3. 从什么位置给model赋值: 5.结束节点
4. 从什么位置可以打印出数组: 已经结束分析文件(最后执行)
*/
#pragma mark - NSXMLParser代理方法
// 1.
已经开始分析文件 (最先执行),这个方法值只走一次
//
在这个方法里面初始化数组
- (void)parserDidStartDocument:(NSXMLParser*)parser
{
//
初始化数组
self.dataArray= [NSMutableArrayarray];
NSLog(@"已经开始分析文件");
}
// 2.
已经结束分析文件 (最后执行)
//
- (void)parserDidEndDocument:(NSXMLParser*)parser
{
NSLog(@"已经结束分析文件");
NSLog(@"%@",self.dataArray);
}
// 3.
开始遇到节点
//
初始化model
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI
qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict
{
//
初始化model
// Student
是内层的节点, // self.model 这个model是在本类中声明的
if
([elementName isEqualToString:@"Student"]) {
self.model= [[StudentModelalloc]init];
}
//NSLog(@"开始遇到节点");
NSLog(@"<%@>", elementName);//节点名字
}
// 4.
发现字符, 逐行发现
//
拿出数据
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string
{
//
保存字符串 , self.string也是被类声明的 nsstring类型的
self.string= string;// string就是<></>之间的内容
// NSLog(@"发现字符");
NSLog(@"string: %@", string);
}
// 5.
结束节点
//
给model赋值
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI
qualifiedName:(NSString*)qName
{
//
给model赋值
if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于
self.model.name=self.string;
} else
if ([elementName isEqualToString:@"gender"]) {
self.model.gender=self.string;
} else
if ([elementName isEqualToString:@"age"]) {
self.model.age=self.string;
} else
if ([elementName isEqualToString:@"motto"]) {
self.model.motto=self.string;
} else
if ([elementName isEqualToString:@"Student"]) {
//
节点等于Student的时候一个model就赋值完成了,可以装进数组了
[self.dataArrayaddObject:self.model];
[_model
release]; //装进数组后就可以释放了
}
//NSLog(@"遇到节点结束触发");
NSLog(@"</%@>", elementName);
}
/******************** Dom解析 一次性解析完成 **************************/
// Dom解析
//
使用 GDataXmlNode这个类库来实现(第三方类库, 谷歌写的类库)
//
直接导入类库报错
//
报错原因: GDataXmlNode
基于 libxml来写的,所以必须把libxml框架导入工程里面
- (void)setUpDataGDataXmlNode
{
//
创建路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
//
转换成NSData
NSData *data =[NSDatadataWithContentsOfFile:path];
//
利用XMLNode类进行Dom解析
//
用data初始化管理文件的对象,转化成树形结构
// <#(NSError **)#>
如果解析失败可以打印出理由,
需要传入&error
NSError *error =nil;
GDataXMLDocument *document = [[GDataXMLDocument
alloc]
initWithData:dataoptions:0error:&error];
// 2.
获取根节点
GDataXMLElement *rootElement = [document
rootElement];
//NSLog(@"%@", rootElement);
// 3.
获取根节点下Student节点(Student 下面有好多Student节点, 获取气候放到数组里面)
NSArray
*stusArray = [rootElement elementsForName:@"Student"];
//NSLog(@"%@", stusArray);
//
循环外面初始化一下数组 用来保存model
self.dataArray= [NSMutableArrayarray];
//
遍历Student节点的数组
for (inti =0; i < stusArray.count;
i++) {
//
取出每一个Student节点
GDataXMLElement
*oneStudentElement = stusArray[i];
//
// //
取出oneStudentElement节点下的name的数组(这个数组里面存放的是节点,数据类型是GDataXMLElement类型)
// NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
// NSLog(@"nameArray: %@", nameArray);
//
// //
取出name节点,
// GDataXMLElement *nameElement = [nameArray firstObject]; //第0个元素
//
// //
转化为字符串
// NSString *name = [nameElement stringValue];
// NSLog(@"name: %@", name);
//
//
//
// //
取出oneStudentElement节点下的gender的数组
// NSArray *genderArray = [oneStudentElement elementsForName:@"gender"];
// //
取出gender节点
// GDataXMLElement *genderElement = genderArray[0];
// //
转化为字符串
// NSString *gender = [genderElement stringValue];
// NSLog(@"gender: %@", gender);
//
//
// NSArray *ageArray = [oneStudentElement elementsForName:@"age"];
// GDataXMLElement *ageElement = ageArray[0];
// NSString *age = [ageElement stringValue];
//
// NSArray *mottoArray = [oneStudentElement elementsForName:@"motto"];
// GDataXMLElement *mottoElement = [mottoArray firstObject];
// NSString *motton = [mottoElement stringValue];
//
// 三次次调用封装的方法
NSString*name = [selfbackStringWithElement:oneStudentElementelementName:@"name"];
NSString *gender = [self
backStringWithElement:oneStudentElement
elementName:@"gender"];
NSString *age = [self
backStringWithElement:oneStudentElement
elementName:@"age"];
NSString *motto = [self
backStringWithElement:oneStudentElement
elementName:@"motto"];
//
给model赋值
//
初始化model
StudentModel *model = [[StudentModel
alloc]
init];
model.name = name;
model.gender = gender;
model.age = age;
model.motto = motto;
//
把model装进数组
[self.dataArrayaddObject:model];
[model release];
}
}
//
封装的方法 返回节点中的字符串
- (NSString *)backStringWithElement:(GDataXMLElement*)element elementName:(NSString*)elementName
{
//
取出oneStudentElement节点下的name的数组
NSArray *nameArray = [elementelementsForName:elementName];
NSLog(@"nameArray: %@", nameArray);
//
取出name节点
GDataXMLElement *nameElement = [nameArray
firstObject];//第0个元素
//
转化为字符串
NSString *name = [nameElementstringValue];
return name;
}
/*********** Dom解析结束 *************************/
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
![](cid:0aa5af4ebcde8df4a1ce564b49e3f9a1)
// JSON
解析数据 上面的教师的数据
- (void)setUpJson
{
//
获取路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Teacher"ofType:@"json"];
//
变成dada
NSData *data = [NSDatadataWithContentsOfFile:path];
//
把data转化成可变数组或者可变字典(是字典还是数组,要看json最外层是什么)
// NSJSONSerialization json使用的类
NSError *error =nil;
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
//NSLog(@"%@", dataArray);
self.dataArray= [NSMutableArrayarray];
//
剥��香蕉
for (NSDictionary*dicin
dataArray) {
TeacherModel *model = [[TeacherModel
alloc]
init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArrayaddObject:model];
[model release];
}
NSLog(@"%@",self.dataArray);
}
[]
// json解析城市数据
- (void)setUpDataJsonCity
{
NSString *path = [[NSBundlemainBundle]pathForResource:@"area"ofType:@"json"];
NSData *data = [NSDatadataWithContentsOfFile:path];
NSError *error =nil;
//
把data转化成可变字典或数组,因为城市数据最外层是数组,所以用
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
self.dataArray= [NSMutableArrayarray];
/******* JSONKIT
解析 *********/
//
导入第三方类库
//NSMutableArray *jsonKitArray = [data objectFromJSONData]; //等价于 上面的 NSJSONSerialization解析
/******** ************/
//
剥香蕉
//
遍历数组,
因为数组里面的元素类型是NSDictionary类型,所以遍历的时候是(NSDictionary
*dic in dataArray)
for (NSDictionary*dicin
dataArray) {
CityModel *model = [[CityModel
alloc]
init];//构建model
[model setValuesForKeysWithDictionary:dic];//给model进行KVC赋值,把字典装进model
[self.dataArrayaddObject:model];//把model装进数组
}
}
// NSXMLParser
分析XML文件
- (void)setUpDataXMLParser
{
// 3.
创建路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
// 2. NSData存储数据,以二进制形式存储
NSData *data = [NSDatadataWithContentsOfFile:path];
// 1.
创建一个分析人 类
NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data];
//
设置代理
parser.delegate =
self;
//
开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate)
[parser parse];
//
释放分析人
[parser release];
NSLog(@"我在这里释放行吗?");
}
/**
* 执行顺序:
1. 开始分析: [parser parse];
// 开始代理方法的实现
1. 开始分析文件
2. 开始遇到节点
3. 发现字符
4. 结束遇到节点
5. 结束分析文件
*/
/***************************************************************/
/**
* 把XML数据保存到model需要的操作
1. 把数据取出来
2. 装进model
3. 把model装进数组,备用
1. 从什么位置初始化数组:开始分析文件位置
2. 从什么位置初始化model:开始遇到节点
// 从什么位置可以拿出数据: 4.发现字符
3. 从什么位置给model赋值: 5.结束节点
4. 从什么位置可以打印出数组: 已经结束分析文件(最后执行)
*/
#pragma mark - NSXMLParser代理方法
// 1.
已经开始分析文件 (最先执行),这个方法值只走一次
//
在这个方法里面初始化数组
- (void)parserDidStartDocument:(NSXMLParser*)parser
{
//
初始化数组
self.dataArray= [NSMutableArrayarray];
NSLog(@"已经开始分析文件");
}
// 2.
已经结束分析文件 (最后执行)
//
- (void)parserDidEndDocument:(NSXMLParser*)parser
{
NSLog(@"已经结束分析文件");
NSLog(@"%@",self.dataArray);
}
// 3.
开始遇到节点
//
初始化model
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI
qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict
{
//
初始化model
// Student
是内层的节点, // self.model 这个model是在本类中声明的
if
([elementName isEqualToString:@"Student"]) {
self.model= [[StudentModelalloc]init];
}
//NSLog(@"开始遇到节点");
NSLog(@"<%@>", elementName);//节点名字
}
// 4.
发现字符, 逐行发现
//
拿出数据
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string
{
//
保存字符串 , self.string也是被类声明的 nsstring类型的
self.string= string;// string就是<></>之间的内容
// NSLog(@"发现字符");
NSLog(@"string: %@", string);
}
// 5.
结束节点
//
给model赋值
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI
qualifiedName:(NSString*)qName
{
//
给model赋值
if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于
self.model.name=self.string;
} else
if ([elementName isEqualToString:@"gender"]) {
self.model.gender=self.string;
} else
if ([elementName isEqualToString:@"age"]) {
self.model.age=self.string;
} else
if ([elementName isEqualToString:@"motto"]) {
self.model.motto=self.string;
} else
if ([elementName isEqualToString:@"Student"]) {
//
节点等于Student的时候一个model就赋值完成了,可以装进数组了
[self.dataArrayaddObject:self.model];
[_model
release]; //装进数组后就可以释放了
}
//NSLog(@"遇到节点结束触发");
NSLog(@"</%@>", elementName);
}
/******************** Dom解析 一次性解析完成 **************************/
// Dom解析
//
使用 GDataXmlNode这个类库来实现(第三方类库, 谷歌写的类库)
//
直接导入类库报错
//
报错原因: GDataXmlNode
基于 libxml来写的,所以必须把libxml框架导入工程里面
- (void)setUpDataGDataXmlNode
{
//
创建路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
//
转换成NSData
NSData *data =[NSDatadataWithContentsOfFile:path];
//
利用XMLNode类进行Dom解析
//
用data初始化管理文件的对象,转化成树形结构
// <#(NSError **)#>
如果解析失败可以打印出理由,
需要传入&error
NSError *error =nil;
GDataXMLDocument *document = [[GDataXMLDocument
alloc]
initWithData:dataoptions:0error:&error];
// 2.
获取根节点
GDataXMLElement *rootElement = [document
rootElement];
//NSLog(@"%@", rootElement);
// 3.
获取根节点下Student节点(Student 下面有好多Student节点, 获取气候放到数组里面)
NSArray
*stusArray = [rootElement elementsForName:@"Student"];
//NSLog(@"%@", stusArray);
//
循环外面初始化一下数组 用来保存model
self.dataArray= [NSMutableArrayarray];
//
遍历Student节点的数组
for (inti =0; i < stusArray.count;
i++) {
//
取出每一个Student节点
GDataXMLElement
*oneStudentElement = stusArray[i];
//
// //
取出oneStudentElement节点下的name的数组(这个数组里面存放的是节点,数据类型是GDataXMLElement类型)
// NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
// NSLog(@"nameArray: %@", nameArray);
//
// //
取出name节点,
// GDataXMLElement *nameElement = [nameArray firstObject]; //第0个元素
//
// //
转化为字符串
// NSString *name = [nameElement stringValue];
// NSLog(@"name: %@", name);
//
//
//
// //
取出oneStudentElement节点下的gender的数组
// NSArray *genderArray = [oneStudentElement elementsForName:@"gender"];
// //
取出gender节点
// GDataXMLElement *genderElement = genderArray[0];
// //
转化为字符串
// NSString *gender = [genderElement stringValue];
// NSLog(@"gender: %@", gender);
//
//
// NSArray *ageArray = [oneStudentElement elementsForName:@"age"];
// GDataXMLElement *ageElement = ageArray[0];
// NSString *age = [ageElement stringValue];
//
// NSArray *mottoArray = [oneStudentElement elementsForName:@"motto"];
// GDataXMLElement *mottoElement = [mottoArray firstObject];
// NSString *motton = [mottoElement stringValue];
//
// 三次次调用封装的方法
NSString*name = [selfbackStringWithElement:oneStudentElementelementName:@"name"];
NSString *gender = [self
backStringWithElement:oneStudentElement
elementName:@"gender"];
NSString *age = [self
backStringWithElement:oneStudentElement
elementName:@"age"];
NSString *motto = [self
backStringWithElement:oneStudentElement
elementName:@"motto"];
//
给model赋值
//
初始化model
StudentModel *model = [[StudentModel
alloc]
init];
model.name = name;
model.gender = gender;
model.age = age;
model.motto = motto;
//
把model装进数组
[self.dataArrayaddObject:model];
[model release];
}
}
//
封装的方法 返回节点中的字符串
- (NSString *)backStringWithElement:(GDataXMLElement*)element elementName:(NSString*)elementName
{
//
取出oneStudentElement节点下的name的数组
NSArray *nameArray = [elementelementsForName:elementName];
NSLog(@"nameArray: %@", nameArray);
//
取出name节点
GDataXMLElement *nameElement = [nameArray
firstObject];//第0个元素
//
转化为字符串
NSString *name = [nameElementstringValue];
return name;
}
/*********** Dom解析结束 *************************/
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
// JSON
解析数据 上面的教师的数据
- (void)setUpJson
{
//
获取路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"Teacher"ofType:@"json"];
//
变成dada
NSData *data = [NSDatadataWithContentsOfFile:path];
//
把data转化成可变数组或者可变字典(是字典还是数组,要看json最外层是什么)
// NSJSONSerialization json使用的类
NSError *error =nil;
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
//NSLog(@"%@", dataArray);
self.dataArray= [NSMutableArrayarray];
//
剥��香蕉
for (NSDictionary*dicin
dataArray) {
TeacherModel *model = [[TeacherModel
alloc]
init];
[model setValuesForKeysWithDictionary:dic];
[self.dataArrayaddObject:model];
[model release];
}
NSLog(@"%@",self.dataArray);
}
[]
// json解析城市数据
- (void)setUpDataJsonCity
{
NSString *path = [[NSBundlemainBundle]pathForResource:@"area"ofType:@"json"];
NSData *data = [NSDatadataWithContentsOfFile:path];
NSError *error =nil;
//
把data转化成可变字典或数组,因为城市数据最外层是数组,所以用
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
self.dataArray= [NSMutableArrayarray];
/******* JSONKIT
解析 *********/
//
导入第三方类库
//NSMutableArray *jsonKitArray = [data objectFromJSONData]; //等价于 上面的 NSJSONSerialization解析
/******** ************/
//
剥香蕉
//
遍历数组,
因为数组里面的元素类型是NSDictionary类型,所以遍历的时候是(NSDictionary
*dic in dataArray)
for (NSDictionary*dicin
dataArray) {
CityModel *model = [[CityModel
alloc]
init];//构建model
[model setValuesForKeysWithDictionary:dic];//给model进行KVC赋值,把字典装进model
[self.dataArrayaddObject:model];//把model装进数组
}
}
相关文章推荐
- iOS中AOP与Method Swizzling 项目中的应用
- IOS多线程之GCD
- iOS NSTimeZone
- 苹果开发 笔记(74)GDataXML 解析 xml
- iOS-细节小结
- 进程&线程-ios
- block的实质
- iOS 警告收录及科学快速的消除方法
- IOS 开发文件操作——NSFileManager
- 自学 iOS 开发的一些经验
- iOS开发-NSLog不打印设置 Prefix
- 自学 iOS 开发的一些经验
- iOS--基础知识--AutoLayout 与 scrollView
- iOS用同一个工程创建两个不同版本的应用
- iOS 开发常用的第三方库
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- IOS--基础知识--AutoLayout资料收集
- xcode6加入pch文件
- iOS 动画关系
- iOS 开发笔记-NSURLConnection的使用