2013-05-12 58 views
-1

我是Xcode的初學者,我嘗試創建一個應用程序來下載XML文件,解析它並在數組中添加每個獲得的元素。這個數組然後被一個表視圖用來創建新的行。不幸的是它沒有奏效。在NSLog幾乎每一步之後,我注意到應用程序下載和解析文件,但是當涉及到將數據添加到數組時,應用程序清空數組並使用最後一個元素填充數據,數量與最後一個元素一樣多元素在開始。即使如此,表視圖應該有一些行,但是當我離開解析例程時,似乎該數組僅填充了「\ n」,這是我不明白的。我分配和正確初始化數組: myArray = [[NSMutableArray alloc]init]; 我對象添加到陣列: [myArray addObject:@"Hello"];XML解析後的數組爲空

我準確的,我使用的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; 
} 

編輯 由於北斗星,我在parser:didEndElement:的每個if條件的末尾加上了currentElement = nil,並且他給了我的驗證。它現在完美地工作!感謝所有試圖幫助的人:)

+0

請發佈您正在使用的代碼。 – Jim 2013-05-12 14:33:07

+0

我們可以有一個下載的文件的樣本? – Undo 2013-05-12 14:42:32

+0

對於XMLParser代碼,我使用了Apple提供的代碼(https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/XMLParsing/Articles/HandlingElements.html#//apple_ref/doc/uid/20002265-BCIJFGJI)。 – 2013-05-12 15:04:26

回答

0

您正在重複使用currentElement並更新了值。每次更新值時,都會覆蓋舊值 - 在以前存儲的任何位置(它與所有陣列中的對象相同)。

parser:didEndElement:的結尾處,您想設置currentElement = nil;。然後,在parser:foundCharacters:你想檢查:

if (currentElement == nil) { 
    currentElement = [[NSMutableString alloc] initWithString:string]; 
} else { 
    [currentElement appendString:string]; 
} 
+0

它解決了我的問題。非常感謝你,我一整天都在爲這件事而煩惱! :) – 2013-05-12 17:18:51