最近因为项目中需要XML数据的解析方式所以在这里对XML数据解析方式进行了一些复习和总结。
以学生对象为例来说明吧
首先先在UITableViewController的子类里引入头文件,并创建学生对象来存储信息,同时创建一个可变数组来存储学生对象
#import "SAXViewController.h"
#import "Student.h"
@interface SAXViewController ()
@property (nonatomic,retain) NSMutableArray *students;//存储学生信息
@property (nonatomic,retain) Student *stu;//存储一个学生对象
在解析数据的时候需要创建一个字符串属性来存储数据
@property (nonatomic,copy) NSString *content;//存储标签之间的数据
@end
@implementation SAXViewController
- (void)viewDidLoad {
[super viewDidLoad];
在加载视图方法中添加解析按钮并为按钮添加点击事件,触发解析过程
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithTitle:@"解析" style:UIBarButtonItemStylePlain target:self action:@selector(handleSAXParse:)]autorelease];
}
- (void)handleSAXParse: (UIBarButtonItem *)sender {
以下我讲分步骤阐述:
//1:获取XML数据的文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//2:j将XML数据转换成二进制数据流NSData
NSData *data = [NSData dataWithContentsOfFile:filePath];
//3:创建一个XML数据的解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4:设置代理
parser.delegate = self;
//5:启动解析器
[parser parse];
//6释放空间
[parser release];
}
XML数据解析方式的代理方法有五个,下面我分别说明这五个方法实现的时机和内容
//当整个解析过程开始的时候调用
- (void)parserDidStartDocument:(NSXMLParser *)parser {
[self.students removeAllObjects];
}
//当解析过程中发现开始标签的时候调用
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"Student"]) {
//创建学生对象
self.stu = [[[Student alloc]init]autorelease];
self.stu.position = attributeDict[@"position"];
}
}
//发现标签之间存储的数据的时候调用
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
self.content = string;//存储标签之间的数据
}
//当发现结束标签的时候调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"name"]) {
self.stu.name = self.content;
}else if ([elementName isEqualToString:@"gender"]) {
self.stu.gender = self.content;
}else if ([elementName isEqualToString:@"age"]) {
self.stu.age = self.content;
}else if ([elementName isEqualToString:@"motto"]) {
self.stu.motto = self.content;
}else if ([elementName isEqualToString:@"Student"]) {
[self.students addObject:self.stu];
}
}
//当整个解析过程结束的时候调用
- (void)parserDidEndDocument:(NSXMLParser *)parser {
//刷新数据
[self.tableView reloadData];
}
到此整个XML解析过程结束,下面只需要将存储的学生信息添加到相应的UITableViewCell即可。
以上只是系统内置的SAX解析,逐行解析,解析效率低。
另一种DOM解析是一次性全部读入内存,效率比较高
DOM解析又分为根节点解析和叶子节点解析
根节点解析需要获取根节点,然后获取根节点的叶子节点,如果获取的叶子节点也有叶子节点,再通过for循环来获取每一层下得所有叶子节点。
叶子节点解析只需要使用相对路径查找所有的叶子节点,然后通过循环方式获取相应属性的节点。
原文:http://www.cnblogs.com/weiyingxu/p/5100407.html