2012-01-26 5 views
0

RSS 뉴스의 XML 파일을 구문 분석하려고합니다. 첫째, 나는 http://ria.ru/export/rss2/index.xml에서 RSS를 시도하고 모든 것이 완벽하게 작동했다. 그럼, 즉 http://interfax.ru/rss.asp 다른 리소스를 시도하고 나는 날짜에 문제가 발생했습니다 목표 C로 RSS 구문 분석

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입니다. stringTimedateFormatFromString은 모두 NULL 값을 생성합니다. 같은 형식의 날짜로 주소 RSS를 변경했지만 여전히이 문제가 있습니다.

+0

_exactly_는 구문 분석하려는 두 번째 날짜 문자열입니다. (첫 번째는 'Wed, 25 Jan 2012 16:41:00 +0400') – deanWombourne

답변

0

두 경우 모두 [dateFormat dateFromString:]에 전달되는 문자열을 정확하게 모른 채 정확하게 무슨 일이 일어나고 있는지 말하기는 어렵습니다. 범위를 좁히기 위해 구체적인 세부 정보를 게시해야합니다.

더 많은 것을 알지 못해도 두 링크 사이에 나타나는 유일한 명백한 차이점은 서로 다른 텍스트 인코딩을 사용하는 것입니다. 인코딩 차이를 고려하지 않고 같은 방식으로 구문 분석하는 경우 [item objectForKey:]의 내용이 실제로이 두 RSS 피드간에 동일하지 않을 수도 있습니다.

1

에 대해 피드 (사용자가 소유 한 특정 피드 만 해당)가 아닌 RSS 리더를 만들려고한다면 모든 종류의 잘못된 날짜 형식을 처리해야합니다. 사양이 있지만 많은 RSS 피드가 사양을 따르지 않습니다.

한 가지 방법은 날짜 형식의 배열을 가지고 있고, nil이 아닌 문자열이 반환 될 때까지 그것을 통해 열거하는 것입니다

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

http://interfax.ru/rss.asp를 통해 NSDate를 얻을 수 없습니다. 나는 어떤 RSS도 사용할 필요가 없다. –