XML的解析 SAX方式
程序员文章站
2022-03-14 18:12:43
...
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
上一篇: JS树的遍历
下一篇: C# 文件下载之断点续传实现代码