2011-03-30 61 views
0

我想解析一個XML文件。它的工作非常出色 - 直到今天...XML解析 - NSXMLParserErrorDomain錯誤5

以下是我開始解析XML:

NSString *link = [[NSString alloc] init]; 
link = @"link_to_xml_file"; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:link] 
              cachePolicy:NSURLRequestReturnCacheDataElseLoad 
             timeoutInterval:30.0]; 

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

這裏就是我如何使用接收到的數據:

- (void)connection:(NSURLConnection *)theConnection 
    didReceiveData:(NSData *)incrementalData 
{ 
    if (data == nil) 
     data = [[NSMutableData alloc] init]; 

    [data appendData:incrementalData]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",actual]]; 

    NSError *parseError = nil; 
    NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] error:&parseError]; 

    if (parseError != nil) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:[parseError localizedDescription] delegate:nil cancelButtonTitle:@"Zurück" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    } //shows an alertview with NSXMLParserErrorDomain error 5 

    NSLog(@"String: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); //returns null 

    NSLog(@"Dictionary: %@",xmlDictionary); //returns null 

    NSMutableDictionary *tempDictForAddDate = [[NSMutableDictionary alloc] initWithDictionary:xmlDictionary]; 

    NSDateFormatter *originalDate = [[NSDateFormatter alloc] init]; 
    [originalDate setDateFormat:@"dd.MM.yyyy"]; 

    NSString *today = [originalDate stringFromDate:[NSDate date]]; 

    [tempDictForAddDate setObject:today forKey:@"updated"]; 

    [tempDictForAddDate writeToFile:filePath atomically:YES]; 

    self.contentList = [[tempDictForAddDate objectForKey:@"xmlObject"] objectForKey:@"event"]; 

    [self sortContent]; 
} 

的XML文件在我的瀏覽器中運行。每個標籤都關閉。沒有任何錯誤,但我從來沒有得到該文件的數據。

我希望有人能幫忙。

mavrick3。

回答

1

您明智地使用了異步url連接,但這意味着您的didReceiveData委託將在數據進入時被多次調用,因此它在解析它時不會完成。

您可能想要將解析移到下面的委託方法中。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Apple's Documentation here

編輯:

總是一個好主意,正式驗證XML - 我傾向於使用W3C工具http://www.w3schools.com/xml/xml_validator.asp

而且,當事情過去可以正常工作停止工作,我總是問自己什麼改變了?文件不同嗎?它是否更大?你確定它存在於服務器上,而你的瀏覽器沒有使用緩存版本嗎?

+0

但它的工作直到今天...我把解析代碼扔到connectionDidFinishLoading:它仍然無法正常工作。當然,我沒有改變任何我的代碼,排序順序..我該怎麼辦? – 2011-03-30 12:24:46

+0

好吧,所以我猜測它的工作只是因爲文件的大小比第一次發送的數據量小。把它移到正確的位置還是不錯的。我會再想一想... – Roger 2011-03-30 12:49:27

+0

它被稱爲增量數據的原因。直到今天,你的回答可能會更小。每次' - (void)連接:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData'被調用時,您需要將該incrementalData追加到NSMutableData對象。其餘的代碼只需要移動到' - (void)connectionDidFinishLoading:(NSURLConnection *)connection' – Joe 2011-03-30 12:49:52