需要解析的 xml 数据:
<?xml version="1.0" encoding="UTF-8"?> <Data> <Movie> <title>good lucky to you</title> <box>111</box> <summary>This is a story</summary> </Movie> <Movie> <title>hello</title> <box>99</box> <summary>oh,yes</summary> </Movie> <Movie> <title>who am i</title> <box>22</box> <summary>chenglong</summary> </Movie> </Data>
通过 上上篇的博客《获取网络数据》 中描述的过程和程序我们可以得到网络上的数据,还可以在这个过程中把数据传递给进行解析数据的方法进行解析的操作,
//自定义一个 PraxMovie 方法,参数时NSDate型的数据,用来传递接受到的数据 - (void)PraxMovie:(NSData*)_data { //NSXMLParser解析xml格式的数据,在这里初始化,并赋值 NSXMLParser* parser = [[NSXMLParser alloc]initWithData:_data]; parser.delegate = self; [parser parse]; }
在解析之前我们要进行清空以前的数据,因为在运行程序的过程中我们有时候会运行多次,所以要删除旧的数据
(注意: 在这个程序中,我们用到了 Movie 和 MovieList 这两个类,Movie中存放的是三个属性[电影名称,票房,介绍],用来存放解析 xml 后得到的三个数据,
而 MovieList 类中定义了 一个可以改变的数组,用来存放 Movie 对象,并实现增加,删除,和查询数组中的 Movie对象的数量 等方法)
//解析前的准备 - (void)parserDidStartDocument:(NSXMLParser *)parser { //移出所有,对MovieList 类中的数组清空 MovieList *xmlMovielist; [self.xmlMovielist.moviearray removeAllObjects]; [self.tempString setString:@""]; }
查询所有的节点,并得到每一个节点中的数据
//查询节点,同时alloc 出一个Movie对象 ,用于储存数据 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"Movie"]) { self.newwMovie = nil; self.newwMovie= [[Movie alloc] init]; [self.tempString setString:@""]; } else { [self.tempString setString:@""]; } } //找到节点数据,通过NSString对象来传递 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(![string isEqualToString:@""]) { [self.tempString appendString:string]; } }
然后把得到得得 节点 进行区分,并把得到得相应数据 存放到不同得 Movie属性 中
//根据查询到的节点,保存数据 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"Movie"]) { //存放到数组中 [self.xmlMovielist Addmovie:self.newwMovie]; } else if([elementName isEqualToString:@"title"]) { //Movie 得title 属性 self.newwMovie.title =[NSString stringWithString:self.tempString]; } else if([elementName isEqualToString:@"box"]) { // Movie boxOfficeGross 属性 int temp = [[NSString stringWithString:self.tempString]intValue]; self.newwMovie.boxOfficeGross = [NSNumber numberWithInt:temp]; } else if([elementName isEqualToString:@"summary"]) { //Movie 得 summary 属性 self.newwMovie.summary =[NSString stringWithString:self.tempString]; } }
当解析完最后一个节点后,解析结束,
//解析结束 - (void)parserDidEndDocument:(NSXMLParser *)parser { //遍历数组,输出每一个节点数据 for (id tmp in self.xmlMovielist.moviearray) { NSLog(@"tmp = %@",tmp); } self.newwMovie = nil; self.tempString = nil; }
解析得过程:
先执行查询节点的方法,然后执行得到节点中的数据的方法,接下来执行 区分节点进行保存数据 ,
<--------------------------
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
到-------》
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
再到-------》
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
------------------------------>
每一个节点都会把这三个方法执行一次,当一个节点遍历完后,再重新执行这一过程去遍历下一个节点,直到所有的节点都遍历完,最后执行:
- (void)parserDidEndDocument:(NSXMLParser *)parser