NSXMLParser 是基于 SAX 的解析器,也就是所谓的“事件驱动”解析器,所以使用 NSXMLParser 解析的关键就是实现 SAX 的时间处理器 --该事件处理器负责处理 NSXMLParser 解析 XML 过程当中的各类事件。网络
NSXMLParser 解析的事件处理采用了委托,所以只要为 NSXMLParser 指定一个 delegate 对象,该对象必须实现 NSXMLParserDelegate 协议app
使用 NSXMLParser 解析 XML 文档的步骤:atom
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1"> <title>疯狂iOS讲义</title> <author>李刚 编著</author> <remark>基于最新版本的iOS 7</remark> </book> <book id="2"> <title>疯狂Java讲义</title> <author>李刚 编著</author> <remark>本书来自做者3年的Java培训经历,凝结了做者近3000个小时的授课经验</remark> </book> <book id="3"> <title>轻量级Java EE企业应用实战</title> <author>李刚 编著</author> <remark>本书主要介绍以Spring+Hibernate+Struts2为基础的Java EE应用</remark> </book> <book id="4"> <title>疯狂Android讲义</title> <author>李刚 编著</author> <remark>本书初版长期雄踞各网店、书店Android图书销量排行榜前列</remark> </book> </books>
#import <Foundation/Foundation.h> @interface FKBook : NSObject @property (nonatomic , assign) NSInteger bookID; @property (nonatomic , copy) NSString *title; @property (nonatomic , copy) NSString *author; @property (nonatomic , copy) NSString *remark; @end
.h文件:spa
#import <Foundation/Foundation.h> @interface FKXMLPraserDelegate : NSObject <NSXMLParserDelegate> // 定义一个NSMutableArray集合来保存解析XML文档获得的数据 @property (nonatomic, strong) NSMutableArray *books; @end
.m文件:code
#import "FKXMLPraserDelegate.h" #import "FKBook.h" @implementation FKXMLPraserDelegate // 定义一个FKBook对象,用于保存正在解析的<book>元素中的数据 FKBook* book; NSString* currentElementValue; // 当开始处理某个元素时触发该方法 -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"开始处理元素 %@" , elementName); if([elementName isEqualToString:@"books"]) { // 若是正在处理根元素,在此处初始化存储解析结果的NSMutableArray集合 self.books = [[NSMutableArray alloc] init]; } // 若是正在处理<book.../>元素 else if([elementName isEqualToString:@"book"]) { // 初始化FKBook对象 book = [[FKBook alloc] init]; // 从attributeDict中读取<book.../>元素的属性id的值 book.bookID = [[attributeDict objectForKey:@"id"] integerValue]; } } // 当开始处理字符串内容时触发该方法 -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"处理字符串内容:%@",string); // 若是当前的字符串值不为nil,保存当前正在处理的元素的值 if(string) { currentElementValue = string; } } // 当处理某个元素结束时触发该方法 -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 若是处理根元素结束,代表XML文档处理完成。 if([elementName isEqualToString:@"books"]) { return; } // 若是处理<book.../>元素结束,则将封装的FKBook对象添加到NSMutableArray集合中 else if([elementName isEqualToString:@"book"]) { [self.books addObject: book]; book = nil; } else { // 若是既不是处理<books.../>元素,也不是处理<book.../>元素的时候, // 则使用KVC方式为当前FKBook对象的属性赋值 [book setValue:currentElementValue forKey:elementName]; currentElementValue = nil; } } @end
// 获取要解析的XML文档的所在的URL(使用URL便可解析本地XML文档,也可解析网络XML文档) NSURL* fileUrl = [[NSBundle mainBundle] URLForResource:@"books" withExtension:@"xml"]; // 获取NSXMLParser实例对象 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:fileUrl]; // 建立NSXMLParser解析的委托对象。 parserDeletage = [[FKXMLPraserDelegate alloc] init]; // 为NSXMLParser指定委托对象,该委托对象就负责处理解析事件 parser.delegate = parserDeletage; // 开始解析, 解析结果会保存在委托对象的books属性中 [parser parse];