XML的解析 SAX方式

XML的解析两种方式,我们来先看第一种,不需要在内存中排成树型结构再去解析的。xml文件如下:
这里写图片描述
viewcontroller中实现:

- (void)viewDidLoad {
    [super viewDidLoad];
    BookXMLParser *parser = [[BookXMLParser alloc]init];

    NSArray *books = [parser parseBooksWithXMLFileName:@"books"];
    NSLog(@"%@",books);
}

下面看核心部分 自定义解析类
1.创建解析类,并传入要解析的文件

- (NSArray *)parseBooksWithXMLFileName:(NSString *)name{
    self.books = [NSMutableArray array];
    NSString *path = [[NSBundle mainBundle]pathForResource:name ofType:@"xml"];

    //创建系统提供的解析类
    NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path]];

    parser.delegate = self;

    //开始解析
    [parser parse];

    return self.books;
}

实现代理方法,开始标签

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"开始标签:%@",elementName);

    if ([elementName isEqualToString:@"book"]) {
        Book *b = [Book new];

        [self.books addObject:b];

        b.bookID = attributeDict[@"bookID"];


    }

}

发现字符串代理方法

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    NSLog(@"发现文本:%@",string);
    self.currentString = string;
}

结束标签代理方法

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"结束标签:%@",elementName);
    Book *b = self.books.lastObject;
    if ([elementName isEqualToString:@"title"]) {

        b.title = self.currentString;

    }else if ([elementName isEqualToString:@"price"]) {

        b.price = self.currentString;

    }else if ([elementName isEqualToString:@"page"]) {

        b.page = self.currentString;

    }else if ([elementName isEqualToString:@"author"]) {

        b.author = self.currentString;

    }
}

通过输出结果我们一起理解一下sax解析过程
这里写图片描述
可以看到标签成对解析,开始标签–发现文本–结束标签–发现文本是一个过程,会逐层匹配。在这个过程中,我们每一次解析可以拿到自己想要的东西,赋值给模型类。这就是SAX解析

xml解析另一种,高效率方式DOM解析 具体参考微博:
http://blog.csdn.net/lee727n/article/details/73273411

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值