-1

我是 Xcode 的初学者,我试图创建一个应用程序来下载 XML 文件,解析它并将每个获得的元素添加到数组中。然后这个数组被 Table View 用来创建新行。不幸的是,它没有用。在 NSLogging 几乎每一步之后,我注意到应用程序会下载并解析文件,但是在将数据添加到数组时,应用程序会清空数组并用最后一个元素再次填充它,次数与原来一样多一开始的元素。即使这样,表格视图也应该有一些行,但是当我退出解析例程时,似乎数组只填充了“\n”,我不明白。我确实正确地分配和初始化了数组: myArray = [[NSMutableArray alloc]init]; 并且我将对象添加到数组中: [myArray addObject:@"Hello"];

我确切地说我使用的是 Xcode 4.6.2。对于 iOS 6,我是初学者(请不要开枪;))

谢谢你的帮助!

我使用的 XML 文件可以在 ilgl.lgl.lu/Missings_Data/Missings_Data.xml 上找到

这是我使用的部分代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:  (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"Released_classes"]) {
    prof = [[NSMutableArray alloc]init];
    classe = [[NSMutableArray alloc]init];
    span = [[NSMutableArray alloc]init];
    service = [[NSMutableArray alloc]init];
    currentElement = [[NSMutableString alloc] init];
    NSLog(@"Data containers initialized");
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
// ignore root and empty elements
if ([elementName isEqualToString:@"Missing_Class"] || [elementName isEqualToString:@"Released_classes"]) return;
if ([elementName isEqualToString:@"Classe"]) {
    [classe addObject:currentElement];
    NSLog(@"Added element to Classe: %@", currentElement);
    NSLog(@"Elements in class: %@", classe);
    return;
}
if ([elementName isEqualToString:@"Professeur"]) {
    [prof addObject:currentElement];
    NSLog(@"Added element to Prof: %@", currentElement);
    NSLog(@"Elements in prof: %@", classe);
    return;
}
if ([elementName isEqualToString:@"Lecon_libérée"]) {
    [span addObject:currentElement];
    NSLog(@"Added element to Span: %@", currentElement);
    NSLog(@"Elements in span: %@", classe);
    return;
}
if ([elementName isEqualToString:@"Service"]) {
    [service addObject:currentElement];
    NSLog(@"Added element to Service: %@", currentElement);
    NSLog(@"Elements in service: %@", classe);
    return;
}
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[currentElement setString:string];
}

#pragma mark - Table View Data Organization

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
 // Return the number of sections.
 NSLog(@"Number of sections: predefined 1");
 return 1;
 }

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
 // Return the number of rows in the section.
 NSLog(@"Number of rows: %i", [classe count]);
 return [classe count];
 }

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
 static NSString *MyIdentifier = @"MyReuseIdentifier";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
 if (cell == nil) {
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault      reuseIdentifier:MyIdentifier];
 }
 NSString *cellText = [classe objectAtIndex:indexPath.row];
 cell.textLabel.text = cellText;
 NSLog(@"Cell being created: %@", cellText);
 return cell;
 }

编辑 感谢 Wain,我在每个条件currentElement = nil结束之前添加了他给我的验证。它现在完美运行!感谢所有试图提供帮助的人:)ifparser:didEndElement:

4

1 回答 1

0

您一直在重用currentElement并更新值。每次更新值时,您都会覆盖旧值 - 您之前存储它的任何地方(它是所有数组中的同一个对象)。

最后parser:didEndElement:你要设置currentElement = nil;. 然后,在parser:foundCharacters:你想要检查:

if (currentElement == nil) {
    currentElement = [[NSMutableString alloc] initWithString:string];
} else {
    [currentElement appendString:string];
}
于 2013-05-12T16:52:31.883 回答