需要解析的 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 *)qualifiedNameattributes:(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