Objective-C(iPhone)にて自分用のRSSリーダーを作っております。
以前、別サイト等を参考にして作ったものを改修しているのですが
URLによっては取得できないRSSがあります。
取得できない場合は下記のエラーを吐き出し強制終了してしまいます。
原因がどうしてもわからないのですがお分かりになる方はおりませんでしょうか。
読み込めないサイト
ttp://tv.so-net.ne.jp/rss/schedulesByScriptSearch.action?name=animation&stationAreaId=23
読み込めるサイト
ttp://hamusoku.com/index.rdf
長々とすみません。
RSSリーダーについて
-
紅葉
Re: RSSリーダーについて
エラー内容
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithString:]: nil argument'
*** Call stack at first throw:
////// "RSSParser.h" //////
#import <Foundation/Foundation.h>
#import "Item.h"
@interface RSSParser : NSObject<NSXMLParserDelegate>{
NSMutableArray *items;
NSXMLParser *parser;
NSString *currentNodeName;
NSMutableString *currentNodeContent;
Rss *currentItem;
}
@property (nonatomic, retain, readonly) NSMutableArray *items;
- (void)parseRSSData:(NSURL *)url;
@end
////// "RSSParser.m" //////
#import "RSSParser.h"
#import "Item.h"
@implementation RSSParser
@synthesize items;
- (void)parseRSSData:(NSURL *)url {
items = [[NSMutableArray alloc] initWithCapacity:0];
parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict {
// NSString *siteName = @"aaa";
// currentItem.siteName = siteName;
if ([elementName isEqualToString:@"item"]) {
currentItem = [[Rss alloc] init];
} else if (currentItem) {
currentNodeName = [elementName copy];
currentNodeContent = [[NSMutableString alloc] initWithCapacity:0];
}
// NSLog( @" %@ ",currentItem.siteName);
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
[items addObject:currentItem];
[currentItem release];
currentItem = nil;
} else if ([elementName isEqualToString:currentNodeName]) {
[currentItem setValue:currentNodeContent forKey:elementName];
[currentNodeName release];
currentNodeName = nil;
[currentNodeContent release];
currentNodeContent = nil;
}
}
// 文字を入れている
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[currentNodeContent appendString:string];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
}
- (void)dealloc {
[items release];
[parser release];
[currentItem release];
[currentNodeName release];
[currentNodeContent release];
[super dealloc];
}
@end
//// RSS 読み込み部分 //////
- (void)viewDidLoad {
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
parser = [[RSSParser alloc] init];
// [parser parseRSSData:[NSURL URLWithString:@"http://tv.so-net.ne.jp/rss/schedulesByScriptSearch.action?name=animation&stationAreaId=23"]];
[parser parseRSSData:[NSURL URLWithString:@"http://hamusoku.com/index.rdf"]];
index = [[NSMutableArray alloc] init];
[index addObjectsFromArray:[parser items]];
}
-
紅葉
Re: RSSリーダーについて
何度も投稿してしまいすみません。
Itemの中身のソースを置かせて頂きます。
又、RSSを分解する時にある部分をコメントにすると落ちません。
Itemの中身のソースを置かせて頂きます。
又、RSSを分解する時にある部分をコメントにすると落ちません。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
~ ~
/* ここをコメントにすると落ちない
else if ([elementName isEqualToString:currentNodeName]) {
[currentItem setValue:currentNodeContent forKey:elementName];
[currentNodeName release];
currentNodeName = nil;
[currentNodeContent release];
currentNodeContent = nil;
}
*/
}
////// "Item.h" //////
#import <Foundation/Foundation.h>
@interface Rss : NSObject {
NSString *title;
NSString *link;
NSString *description;
NSString *pubDate;
NSString *siteName;
}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *link;
@property (nonatomic, retain) NSString *description;
@property (nonatomic, retain) NSString *pubDate;
@property (nonatomic, retain) NSString *siteName;
@end
////// "Item.m" //////
#import "Item.h"
@implementation Rss
@synthesize title;
@synthesize link;
@synthesize description;
@synthesize pubDate;
@synthesize siteName;
- (void)dealloc {
[title release];
[link release];
[description release];
[pubDate release];
[siteName release];
[super dealloc];
}
- (void) setValue:(id)value forUndefinedKey: (NSString *)key {
if ([key isEqualToString:@"dc:date"]) {
// NSLog(value);
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
[inputDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'+09:00'"];
NSString *intputDateStr = value;
NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];
NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
NSString *outputDateFormatterStr = @"yyyy年MM月dd日 HH:mm";
[outputDateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"JST"]];
[outputDateFormatter setDateFormat:outputDateFormatterStr];
NSString *outputDateStr = [outputDateFormatter stringFromDate:inputDate];
// NSLog(@"[in]%@ -> [out]%@(%@)", intputDateStr, outputDateStr, outputDateFormatterStr);
[inputDateFormatter release];
[outputDateFormatter release];
self.pubDate = [[NSString alloc] initWithString:outputDateStr];
//self.pubDate = value;//[[NSString alloc] initWithString:[dateFormatter stringFromDate:str]];
}
}
@end
-
紅葉
Re: RSSリーダーについて
色々と試してみたのですがやはりわかりません。
落ちないURLもあるのでRSSの構造が問題なのでしょうか。
多分、これ専用の構造でも耐えられるように取得している部分を
変更しないといけない気がするのですが何処に問題があるかわからない為、上手く修正できません。
落ちないURLもあるのでRSSの構造が問題なのでしょうか。
多分、これ専用の構造でも耐えられるように取得している部分を
変更しないといけない気がするのですが何処に問題があるかわからない為、上手く修正できません。