RSSリーダーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
紅葉

RSSリーダーについて

#1

投稿記事 by 紅葉 » 14年前

Objective-C(iPhone)にて自分用のRSSリーダーを作っております。
以前、別サイト等を参考にして作ったものを改修しているのですが
URLによっては取得できないRSSがあります。
取得できない場合は下記のエラーを吐き出し強制終了してしまいます。

原因がどうしてもわからないのですがお分かりになる方はおりませんでしょうか。

読み込めないサイト
ttp://tv.so-net.ne.jp/rss/schedulesByScriptSearch.action?name=animation&stationAreaId=23

読み込めるサイト
ttp://hamusoku.com/index.rdf

長々とすみません。

紅葉

Re: RSSリーダーについて

#2

投稿記事 by 紅葉 » 14年前

コード:


エラー内容

 *** 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リーダーについて

#3

投稿記事 by 紅葉 » 14年前

何度も投稿してしまいすみません。
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リーダーについて

#4

投稿記事 by 紅葉 » 14年前

色々と試してみたのですがやはりわかりません。
落ちないURLもあるのでRSSの構造が問題なのでしょうか。

多分、これ専用の構造でも耐えられるように取得している部分を
変更しないといけない気がするのですが何処に問題があるかわからない為、上手く修正できません。

紅葉

Re: RSSリーダーについて

#5

投稿記事 by 紅葉 » 14年前

自己解決しました。
すみませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る