2012-01-26 3 views
0

Я пытаюсь разобрать XML-файл RSS-новостей. Во-первых, я пробовал RSS с http://ria.ru/export/rss2/index.xml, и все работало отлично. Тогда я попробовал еще один ресурс, а именно http://interfax.ru/rss.asp и я столкнулся с проблемой, с датой:Разбор RSS с Objective C

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"]; 

NSDate *dateFormatFromString = [dateFormat dateFromString:[item objectForKey:@"Date"]]; 

NSLog(@"%@", [item objectForKey:@"Date"]); 

NSDateFormatter *dateFormatNew = [[NSDateFormatter alloc]init]; 
[dateFormatNew setDateFormat:@"h:mm a, MMM d, YYYY"];  
NSString *stringTime = [dateFormatNew stringFromDate:dateFormatFromString]; 

NSLog(@"%@", stringTime); 

[item objectForKey:@"Date"] не проблема, это то же самое, как и в RSS. Foor пример:

Wed, 25 Jan 2012 16:41:00 +0400 

Однако второй RSS с таким же форматом даты дает мне NULL. И stringTime, и dateFormatFromString также производит значения NULL. Я изменил адрес RSS с той же датой форматирования и все еще имею эту проблему.

+0

Что _exactly_ - вторая строка даты, которую вы пытаетесь проанализировать? (1-й - «Wed, 25 Jan 2012 16:41:00 +0400») – deanWombourne

ответ

0

Трудно сказать, что происходит, не зная точно, какую строку вы передаете в [dateFormat dateFromString:] в обоих случаях. Вы должны указать более подробные сведения, чтобы уменьшить его.

Не зная больше, единственное очевидное различие, которое я вижу между двумя ссылками, заключается в том, что они, похоже, используют разные текстовые кодировки. Если вы разбираетесь одинаково без учета различий в кодировке, возможно, что содержимое [item objectForKey:] на самом деле не совпадает между этими двумя RSS-каналами.

1

Если вы пытаетесь сделать RSS-ридер для любым каналом (а не только определенным фидом, который у вас есть), вам нужно иметь дело со всеми форматами форматов с неверными форматами. Несмотря на наличие спецификаций, многие RSS-каналы не следуют за ними.

Один подход заключается в массив форматов даты, и не перечислить через него, пока строка не-ноль возвращается:

static NSString *sGetDateForString(NSString *inString) 
{ 
    static NSArray *sPossibleDateFormats = nil; 

    if (!sPossibleDateFormats) sPossibleDateFormats = [[NSArray alloc] initWithObjects: 
     @"EEE, d MMM yyyy HH:mm:ss Z", 
     @"h:mm a, MMM d, YYYY", 
     // Add more formats here as you encounter them in the wild 
     nil]; 

    NSDate *result = nil; 

    for (NSString *format in sPossibleDateFormats) { 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:format]; 

     result = [dateFormat dateFromString:dateString]; 

     [dateFormat release]; 

     if (result) break; 
    } 

    return result; 
} 

Это собирается быть медленным, но это может быть достаточно быстро для вашего приложение. Если вам нужна дополнительная производительность, вы можете попробовать кэшировать индекс согласованного формата даты и передать его обратно в sGetDateForString() (большинство RSS-каналов будут использовать только один формат даты).

+0

Просто я не могу получить NSDate через http://interfax.ru/rss.asp. Мне не нужно использовать какой-либо RSS. –

Смежные вопросы