看到别的大牛的博客后,我也写了一个用NSXMLParser解析XML的小例子。
一、解析的XML文件存放在本地,创建工程什么的我就不说了,首先创建XML,如下所示:
<Books> <Book id="1"> <title>Circumference</title> <author>Nicholas Nicastro</author> <summary>Eratosthenens and the Ancient</summary> </Book> <Book id="2"> <title>Copernicus Secret</title> <author>Jack Repcheck</author> <summary>How the scientific revolution began</summary> </Book> </Books>开始的时候我还在第一行加上了<?xml version="1.0" encoding="UTF-8"?>
但是在运行的时候报错:Error Domain=NSXMLParserErrorDomain Code=96 "The operation couldn’t be completed 把那一行去掉就好了,具体什么原因我还不清楚,如果有大牛知道,希望可以指点我一二。
二、把xml加到工程中
三、因为解析的是BOOK条目,创建一个Book类用于存储数据
#import <Foundation/Foundation.h> @interface Book : NSObject @property (nonatomic,copy)NSString *title; @property (nonatomic,copy)NSString *author; @property (nonatomic,copy)NSString *summary; @end
四、我创建的是sigleView的工程,让ViewController继承NSXMLParserDelegate的代理
@interface ViewController()<NSXMLParserDelegate> { NSXMLParser *parser; NSMutableArray *array; Book *abook; NSString *currentString; } @end增加几个私有成员,array用于存放解析出来的Book类,aBook用于存储每一次解析的Book,currentString为每次解析出的字段值。
五、解析XML,在viewController中增加以下代码:
- (void)viewDidLoad { NSError *error = nil; NSString *path = [[NSBundle mainBundle]pathForResource:@"book" ofType:@"xml"]; NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; parser = [[NSXMLParser alloc]initWithData:data]; [parser setShouldProcessNamespaces:NO]; [parser setShouldReportNamespacePrefixes:NO]; [parser setShouldResolveExternalEntities:NO]; [parser setDelegate:self]; [parser parse]; [super viewDidLoad]; }先找到XML在沙盒中的路径,然后读取XML转换为NSData,中间三个设置为NO的方法我也不清楚是什么意思,都是在那么用,没查到解释。最后别忘了设置代理为self。
六、解析过程,直接上代码:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"Books"]) { array = [[NSMutableArray alloc]init]; } else if([elementName isEqualToString:@"Book"]) { abook = [[Book alloc]init]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(![string isEqualToString:@"\n"]) { currentString = [[NSString alloc]initWithString:string]; } } // sent when the namespace prefix in question goes out of scope. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"Books"]) return; if([elementName isEqualToString:@"Book"]) { [array addObject:abook]; [abook release]; abook = nil; } else { [abook setValue:currentString forKey:elementName]; [currentString release]; currentString = nil; } }第一个方法是解析没一个对应的<></> 的开始,第二个方法是解析出字段值的,但是我解析过程中发现还有回车符,所以加了一个判断。第三个方法就是解析的每个字段的结束了。
七、解析完了我还在界面增加了个按钮打印array中的值。
在界面上增加一个按钮,点击后打印array的值。
-(void) buttonDown { NSLog(@"%@",array); }当然Book类是不能直接打印出成员值的,我们还需要Book类重写deacription方法:
-(NSString*)description { return [NSString stringWithFormat:@"%@,%@,%@",self.title,self.author,self.summary]; }就是这样了。。