/**
* 解析: 按照约定好(假象)的格式提取数据的过程叫做解析. 数据提供方(后台)按照格式存放数据, 数据提取方(前端)按照格式提取数据
主流的数据结构: XML 和 JSON;
XML数据结构的特点:
1.有变迁组成, 而且标签是一对的, 一对开始标签和结束标签叫 节点
2.节点可以有子节点和父节点, 没有父节点的节点叫根节点, 没有子节点的节点叫叶子节点
3.节点可以用来存储数据
XML 解析原理:
1.SAX解析: 是一种基于事件回调的解析机制(主要通过代理方法进行解析), 逐行解析, 逐行写入内存, 适合大数据的解析, 效率比较低, 系统解析就是这种方式
2.DOM解析: 将数据全部读入内存, 将数据读成树形结构, 逐层进行解析, 适用于小数据解析, 效率比较高, 第三方解析的解析原理
*/
//点击解析, 移除数组中数组
[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 make -- NSXMLParserDelegate
// 当读取到开始标签时触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
//parser 解析工具对象; elementName 标签名字; namespaceURI 命名标签唯一标示; qName 标签名 attributes 节点中的属性
//当读取到student 开始标签时, 创建student对象
if ([elementName isEqualToString:@"Student"]) {
self.stu = [[[Student alloc]init] autorelease];
//节点属性对应的数据,
self.stu.position = attributeDict[@"position"];
}
}
//当读取到标签后内容时触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//保存读取到标签后的内容
self.string = string;
}
//当读取到结束标签时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
}
//解析结束时触发
- (void)parserDidEndDocument:(NSXMLParser *)parser {
//解析结束, 重新刷新页面
[self.tableView reloadData];
}