2011-04-20 47 views
0

3個級別,我有獲得A-的價值問題> 1,2,3,4 & B-> 1,2,3,4NSXML解析器高達上iphone

我必須在顯示這些數據3桌

表1)A,B 表2)當用戶點擊A - >他可以看到1,2,3,4以表格形式 但我的情況我只能顯示A的最後一個值即,4(未1,2,3)

如何解析所有1,2,3,4-

<?xml version="1.0" encoding="UTF-8"?> 
<hall> 
<movie Name="A"> 
<stall Name="1"> 
<description>qwe.</description> 
<rating>5</rating> 
</stall> 
<stall Name="2"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
<stall Name="3"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
<stall Name="4i"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
</movie > 
<movie Name="B"> 
<stall Name="t1"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
<stall Name="2"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
<stall Name="3"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
<stall Name="4"> 
<description>wer.</description> 
<rating>5</rating> 
</stall> 
</movie> 
</hall> 

最新通報

我的問題是我不知道如何分離電影名A和B的數據

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 

    if([elementName isEqualToString:@"hall"]) 
    { 
     movieList = [[NSMutableDictionary alloc]init]; 
      appDelegate.books = [[NSMutableArray alloc]init]; 
     appDelegate.HospN = [[NSMutableArray alloc]init]; 
    } 
    else if([elementName isEqualToString:@"movie"]) 
    { 
     currentMovie = [[NSString alloc] initWithString:[attributeDict objectForKey:@"Name"]] ; 
     [appDelegate.books addObject:[attributeDict objectForKey:@"Name"]]; 


     //[aBook.movie addObject:[attributeDict objectForKey:@"Name"]]; 
     NSLog(@"Processing Value: %@", currentMovie); 
     //aBook.testament=currentMovie; 

     aBook.stall = [attributeDict objectForKey:@"name"]; 

     NSLog(@"Movie A name : %@",[movieList objectForKey:@"A"]); 


    } 
    else if([elementName isEqualToString:@"stall"]) 
    { 
     [appDelegate.HospN addObject:[attributeDict objectForKey:@"Name"]]; 
     NSLog(@"Processing stall Value: %@", currentElementValue); 

     NSLog(@"appDelegate.HospN: %@", appDelegate.HospN); 

    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    else 
     [currentElementValue appendString:string]; 

    //NSLog(@"Processing Value: %@", currentElementValue); 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if([elementName isEqualToString:@"hall"]) 
    { 
     //NSLog(@"Movie List : %@",movieList); 
    } 
    else if([elementName isEqualToString:@"movie"]) 
    { 
     [movieList setObject:appDelegate.books forKey:currentMovie]; 


     NSLog(@"Movie name : %@",appDelegate.books); 



     NSLog(@"Movie A name : %@",[movieList objectForKey:@"A"]); 
     [currentMovie release]; 
     //[stallNames release]; 
     currentMovie = nil; 
     //stallNames = nil; 
    } 
    else if([elementName isEqualToString:@"stall"]) 
    { 
     //you can populate other attributes here if stall is not just string but a modal class. 
    } 

    else 

     [aBook setValue:currentElementValue forKey:elementName]; 

    [currentElementValue release]; 
    currentElementValue = nil; 
} 

我陣列我appDelegate.HospN:值( 1 , 2, 3, 4i, t1, 2, 3,) **但我想去砍數據= 1,2,3,4i

和B = t1,2,3,4 **

Updtate

如何獲得描述和評分的價值?

else if([elementName isEqualToString:@"description"]) 
     { 
      NSLog(@"desp List : \n%@\n",currentElementValue);// i can see all value but how to chop data based on A and B 


      [movieList setObject:currentLink forKey:@"description"]; 
      [appDelegate.despArray addObject:[movieList copy]]; 


      NSLog(@"adding story: %@",currentLink); 

     } 



    else if([elementName isEqualToString:@"rating"]) 
     { 



     } 

回答

0

通過觀察XML,你會發現這樣的關係......

一堂可以有一個或一個以上的電影和電影的每一個可以有一個或多個攤位。

所以你可以做的是。

在xml解析類中有一個實例字典,比如movieList,以及一個實例數組say,stallNames和一個movieName,NSString。

movieList:將電影名字的映射各自的攤位(的NSMutableDictionary) stallNames:。將包含與特定的電影攤位(NSMutablArray) currentMovie:將當前的電影名字,將被用作關鍵movieList詞典(的NSString)

現在startElement方法...

if([elementName isEqualToString:@"hall"]) 
{ 
    movieList = [[NSMutableDictionary alloc]init]; 
} 
else if([elementName isEqualToString:@"movie"]) 
{ 
    currentMovie = [[NSString alloc] initWithString:[attributeDict objectForKey:@"Name"]] ; 
    stallNames = [[NSMutableArray alloc]init]; 
} 
else if([elementName isEqualToString:@"stall"]) 
{ 
    [stallNames addObject:[attributeDict objectForKey:@"Name"]]; 
} 

didEndElement方法

if([elementName isEqualToString:@"hall"]) 
{ 
    NSLog(@"Movie List : %@",movieList); 
} 
else if([elementName isEqualToString:@"movie"]) 
{ 
    [movieList setObject:stallNames forKey:currentMovie]; 
    [currentMovie release]; 
    [stallNames release]; 
    currentMovie = nil; 
    stallNames = nil; 
} 
else if([elementName isEqualToString:@"stall"]) 
{ 
    //you can populate other attributes here if stall is not just string but a modal class. 
} 

注意:如你在上面發佈的代碼中,你有一個Book類,它看起來代表Movie,所以你可以做的是,有另一個屬性是數組類型,它將保存停頓名稱。並且此Book對象稍後將添加到數組中(在didEndElement中,當您遇到elementName「movie」時)。使這個數組作爲實例變量,當你遇到的startElement「大廳」的標籤初始化。

UPDATE ANS(按照新的密碼)

//declare following instance variables. I am leaving aBook variable because I am not sure of its use. 
NSMutableDictionary *movieList; 
NSMutableArray *stallArray; 
NSMutableString *currentMovieKey; 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 

    if([elementName isEqualToString:@"hall"]) 
    { 
     movieList = [[NSMutableDictionary alloc]init]; // it will contain list of all the movies in the xml. 
    } 
    else if([elementName isEqualToString:@"movie"]) 
    { 
     currentMovieKey = [[NSMutableString alloc] initWithString:[attributeDict objectForKey:@"Name"]] ; // will be used for setting key for stallArray. 
     stallArray= [[NSMutableArray alloc] init]; // it will contain stall names. 

    } 
    else if([elementName isEqualToString:@"stall"]) 
    { 
     [stallArray addObject:[attributeDict objectForKey:@"Name"]];   
    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    else 
     [currentElementValue appendString:string]; 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if([elementName isEqualToString:@"hall"]) 
    { 
     //parsing finished...end of root tag. movieList will be the final dictionary that will have your data 
     NSLog(@"Movie List : \n%@\n",movieList); 
    } 
    else if([elementName isEqualToString:@"movie"]) 
    { 
     [movieList setObject:stallArray forKey:currentMovieKey]; 

     [currentMovieKey release]; 
     currentMovie = nil; 
     [stallArray release]; 
     stallArray = nil; 
    } 
    else if([elementName isEqualToString:@"stall"]) 
    { 
     //you can populate other attributes here if stall is not just string but a modal class. 
    } 
    //I was not sure about your else part... 

    [currentElementValue release]; 
    currentElementValue = nil; 
} 

感謝,

+0

感謝,但怎麼知道沒有行的時候對電影的用戶點擊和影片B sicne它們是不同的? – prajakta 2011-04-21 01:51:39

+0

你可以...做到這一點[movieList objectForKey:@ 「A」] --->這將返回攤位的數組,然後你將不得不使用.. [movieList objectForKey:@ 「A」]計數。 – Ravin 2011-04-21 03:33:21

+0

我做了我最好的,但沒有工作... :(我不能去高達3個levls – prajakta 2011-05-05 02:20:44