欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML的解析 SAX方式

程序员文章站 2022-03-14 18:12:43
...

XML的解析两种方式,我们来先看第一种,不需要在内存中排成树型结构再去解析的。xml文件如下:
XML的解析 SAX方式
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解析过程
XML的解析 SAX方式
可以看到标签成对解析,开始标签–发现文本–结束标签–发现文本是一个过程,会逐层匹配。在这个过程中,我们每一次解析可以拿到自己想要的东西,赋值给模型类。这就是SAX解析

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

相关标签: xml解析 sax解析