XML的SAX解析
NSXMLParser 分析XML文件
NSXMLParser 分析XML文件
<span style="font-size:14px;">- (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);
} </span>
XML格式的DOM解析
<span style="font-size:14px;">/******************** 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解析结束 *************************/
</span>
json解析
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
<span style="font-size:14px;">// 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装进数组
}
}</span>