XML文档解析
第一种解析方式:SAX
因为这种解析方式是采用协议回调机制,逐行解析,所以苹果提供了一个类,这个类中封装了解析的整个过程,可以通过调用这个类中声明的协议方法来实现SAX解析的每个步骤。
第一步:获取需要解析文件的路径,用这个路径,初始化一个NSData或者NSURL对象,并用初始化好的对象创建一个解析NSXMLParser对象,同时设置执行协议的代理,设置好代理后用“parser”方法开始解析,这样才能按照逻辑执行协议中的方法,进行:开始标签——>取值并赋值——>结束标签——>取值。
- (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);
}