NSXMLParser 解析 XML

前端之家收集整理的这篇文章主要介绍了NSXMLParser 解析 XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

看到别的大牛的博客后,我也写了一个用NSXMLParser解析XML的小例子。

一、解析的XML文件存放在本地,创建工程什么的我就不说了,首先创建XML,如下所示:

  1. <Books>
  2. <Book id="1">
  3. <title>Circumference</title>
  4. <author>Nicholas Nicastro</author>
  5. <summary>Eratosthenens and the Ancient</summary>
  6. </Book>
  7. <Book id="2">
  8. <title>Copernicus Secret</title>
  9. <author>Jack Repcheck</author>
  10. <summary>How the scientific revolution began</summary>
  11. </Book>
  12. </Books>
开始的时候我还在第一行加上<?xml version="1.0" encoding="UTF-8"?>

但是在运行的时候报错:Error Domain=NSXMLParserErrorDomain Code=96 "The operation couldn’t be completed 把那一行去掉就好了,具体什么原因我还不清楚,如果有大牛知道,希望可以指点我一二。

二、把xml加到工程中

三、因为解析的是BOOK条目,创建一个Book类用于存储数据

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Book : NSObject
  4.  
  5. @property (nonatomic,copy)NSString *title;
  6. @property (nonatomic,copy)NSString *author;
  7. @property (nonatomic,copy)NSString *summary;
  8. @end

四、我创建的是sigleView的工程,让ViewController继承NSXMLParserDelegate的代理

  1. @interface ViewController()<NSXMLParserDelegate>
  2. {
  3. NSXMLParser *parser;
  4. NSMutableArray *array;
  5. Book *abook;
  6. NSString *currentString;
  7. }
  8. @end
增加几个私有成员,array用于存放解析出来的Book类,aBook用于存储每一次解析的Book,currentString为每次解析出的字段值。

五、解析XML,在viewController中增加以下代码

  1. - (void)viewDidLoad
  2. {
  3. NSError *error = nil;
  4. NSString *path = [[NSBundle mainBundle]pathForResource:@"book" ofType:@"xml"];
  5. NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
  6. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  7. parser = [[NSXMLParser alloc]initWithData:data];
  8. [parser setShouldProcessNamespaces:NO];
  9. [parser setShouldReportNamespacePrefixes:NO];
  10. [parser setShouldResolveExternalEntities:NO];
  11. [parser setDelegate:self];
  12. [parser parse];
  13. [super viewDidLoad];
  14. }
先找到XML在沙盒中的路径,然后读取XML转换为NSData,中间三个设置为NO的方法我也不清楚是什么意思,都是在那么用,没查到解释。最后别忘了设置代理为self。

六、解析过程,直接上代码

  1. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
  2. {
  3. if([elementName isEqualToString:@"Books"])
  4. {
  5. array = [[NSMutableArray alloc]init];
  6. }
  7. else if([elementName isEqualToString:@"Book"])
  8. {
  9. abook = [[Book alloc]init];
  10. }
  11. }
  12.  
  13. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  14. {
  15. if(![string isEqualToString:@"\n"])
  16. {
  17. currentString = [[NSString alloc]initWithString:string];
  18. }
  19. }
  20. // sent when the namespace prefix in question goes out of scope.
  21.  
  22. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  23. {
  24. if([elementName isEqualToString:@"Books"])
  25. return;
  26. if([elementName isEqualToString:@"Book"])
  27. {
  28. [array addObject:abook];
  29. [abook release];
  30. abook = nil;
  31. }
  32. else
  33. {
  34. [abook setValue:currentString forKey:elementName];
  35. [currentString release];
  36. currentString = nil;
  37. }
  38. }
第一个方法是解析没一个对应的<></> 的开始,第二个方法是解析出字段值的,但是我解析过程中发现还有回车符,所以加了一个判断。第三个方法就是解析的每个字段的结束了。

七、解析完了我还在界面增加了个按钮打印array中的值。

在界面上增加一个按钮,点击后打印array的值。

  1. -(void) buttonDown
  2. {
  3. NSLog(@"%@",array);
  4. }
当然Book类是不能直接打印出成员值的,我们还需要Book类重写deacription方法

  1. -(NSString*)description
  2. {
  3. return [NSString stringWithFormat:@"%@,%@,%@",self.title,self.author,self.summary];
  4. }
就是这样了。。

猜你在找的XML相关文章