一.SAX
SAX 解析: 是一种基于事件回调的解析机制(主要通过代理方法进行解析), 逐行解析, 逐行读取数据, 逐行写入内存, 适合大数据的解析, 效率比较低, 系统解析就是这种方式.
- 在延展中定义属性
@property (nonatomic, retain) NSMutableArray *dataSource; // 存储学生对象
@property (nonatomic, retain) Student *stu; //保存当前的student对象
@property (nonatomic, copy) NSString *string; //保存当前读取到的标签后的内容;
- 要记得懒加载和释放
//懒加载
- (NSMutableArray *)dataSource {
if (!_dataSource) {
self.dataSource = [[NSMutableArray alloc] initWithCapacity:1];
}
return [[_dataSource retain] autorelease];
}
- 解析的步骤和方法
用到了 NSXMLParserDelegate 代理, 需要服从代理和实现方法
//一个触发事件的方法
- (IBAction)saxRightItemAction:(UIBarButtonItem *)sender {
[self.dataSource removeAllObjects];
//1. 获取要解析的文件的路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//2. 根据文件路径, 初始化 NSData 对象
NSData *data = [NSData dataWithContentsOfFile:filePath];
//3. 创建解析工具对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//4. 设置代理, 监测解析过程
parser.delegate = self;
//设置命名空间
parser.shouldProcessNamespaces = YES;
//5. 开始解析
[parser parse];
//释放
[parser release];
}
#pragma mark --- NSXMLParserDelegate
//1. 当读取到开始标签时触发
//parser: 解析工具对象, elementName标签名称; namespaceURI 命名空间的唯一标示; qName 标签名(m:Student); attributeDict 节点中的属性(position的内容)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
//当读取到 Student 开始标签时, 创建 Student 对象
if ([elementName isEqualToString:@"Student"]) {
self.stu = [[[Student alloc] init] autorelease];
self.stu.position = attributeDict[@"position"];
NSLog(@"%@", qName);
NSLog(@"%@", attributeDict);
}
}
//2. 当读取到标签后的内容触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
self.string = string; // 保存读取到的标签后的内容
}
//3. 当读取到结束标签时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"name"]) {
self.stu.name = self.string; // 这个时间节点中的数据 string 正是我们想要的数据
} else if ([elementName isEqualToString:@"gender"]) {
self.stu.gender = self.string;
} else if ([elementName isEqualToString:@"age"]) {
self.stu.age = self.string;
} else if ([elementName isEqualToString:@"phone"]) {
self.stu.phone = self.string;
} else if ([elementName isEqualToString:@"motto"]){
self.stu.motto = self.string;
} else if ([elementName isEqualToString:@"Student"]) {
//当读取到Student结束标签时, 将对象存储到数组中
[self.dataSource addObject:self.stu];
}
}
//4. 当解析结束时触发
- (void)parserDidEndDocument:(NSXMLParser *)parser {
[self.tableView reloadData];
}