XML解析一般分为SAX和DOM.也就是事件和文档.
一.XML解析之SAX解析, 及NSXMLParser
SAX解析说白了就是事物模型解析, 从头开始读取文档, 读完头标签后, 理论上是读取标签值, 最后是结束标签
在ParserTool.h文件中
// 这个是系统提供给的xml的解析方法, 通过代理方法完成解析
@interface ParserTool : NSObject<NSXMLParserDelegate>
@property(nonatomic, retain)NSMutableArray *stuArr;
// 用来保存节点中间的字符串内容
@property(nonatomic, copy)NSString *tempStr;
// 开始解析的方法
- (void)startParser;
在Parser.m文件中
#pragma mark - Method startParser
- (void)startParser {
// 先获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 一般都会把数据变成NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建一个xml的解析工具
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置工具的代理人
parser.delegate = self;
// 开始解析
[parser parse];
[parser release];
}
#pragma mark 碰到开始的节点就会走这个方法(准备解析节点)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
NSLog(@"%@", elementName);
if ([elementName isEqualToString:@"Student"]) {
// 碰到根节点Student, 先把装对象的数组初始化
self.stuArr = [NSMutableArray array];
} else if ([elementName isEqualToString:@"student"]){
// 碰到小写的student, 意味着一个新的学生, 需要创建一个新的对象来装学生的信息
Student *stu = [[Student alloc] init];
[self.stuArr addObject:stu];
[stu release];
}
}
#pragma mark 找到节点内容(获取首尾节点间的内容)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 通过属性来保存节点内容
self.tempStr = string;
}
#pragma mark 当节点结束的时候会执行这个方法(解析完当前节点)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// 这个方法里需要对对象进行赋值, 先找到对象 凡是没付完值都在最后一位
Student *student = [self.stuArr lastObject];
// 给对象进行赋值(通过if进行判断)
// if ([elementName isEqualToString:@"name"]) {
// student.name = self.tempStr;
// } else if ([elementName isEqualToString:@"sex"]){
// student.sex = self.tempStr;
// } else if ([elementName isEqualToString:@"age"]){
// student.age = self.tempStr;
// } else {
// student.hobby = self.tempStr;
// }
// 等同于上面的四句话, 结果是一样的
[student setValue:self.tempStr forKey:elementName];
}
// 这种事系统提供的解析方法, 逐行代理的方法逐行解析数据