您的位置:首页 > 移动开发 > IOS开发

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



// 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装进数组

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: