XML的解析 SAX方式

来源:互联网 发布:试卷软件 编辑:程序博客网 时间:2024/05/02 02:54

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

原创粉丝点击