NSXMLParser 解析 XML

看到别的大牛的博客后,我也写了一个用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];
}
就是这样了。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值