Разбор RSS с целью C - PullRequest
       17

Разбор RSS с целью C

0 голосов
/ 26 января 2012

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

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. Пример:

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

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

Ответы [ 2 ]

1 голос
/ 27 января 2012

Если вы пытаетесь создать 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 голосов
/ 26 января 2012

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

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

...