NSXML解析器高达上iphone

问题描述:

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"]) 
     { 



     } 

通过观察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