Yahoo RSS フィードの media:content タグに含まれる URL を取得しようとしています。didStartElement()、foundCharacters()、および didEndElement() のコードを以下に示します。
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:kChannelElementName]) {
Channel = [[channel alloc] init];
dict=[[NSMutableDictionary alloc] init];
[Channel setItemCollectionArray:[[NSMutableArray alloc] init]];
return ;
}
if ([elementName isEqualToString:kItemElementName]) {
itemCollection=[[ItemDataCollection alloc] init];
return ;
}
if ([elementName isEqualToString:kTitleElementName]) {
return ;
}
if([elementName isEqualToString:kItemDescription]){
return ;
}
if ([elementName isEqualToString:kItemImage]) {
NSString *urlString = attributeDict[@"url"];
if(urlString){
[dict setObject:urlString forKey:@"img"];
}
return ;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (currentElementData == nil) {
self.currentElementData = [[NSMutableString alloc] init];
}
[currentElementData appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:kChannelElementName]) {
[channelCollection addObject:Channel];
NSLog(@"channel are***********%@",channelCollection);
for(ItemDataCollection *mydata in Channel.itemCollectionArray){
NSLog(@"___%@ <><><><><> desc \n %@ <><><><><><> img \n %@",mydata.title,mydata.itemDescription,mydata.titleImage);
}
Channel =nil;
}
else if ([elementName isEqualToString:kItemElementName]) {
[[Channel itemCollectionArray] addObject:itemCollection];
itemCollection=nil;
}
else if ([elementName isEqualToString:kTitleElementName]) {
if(itemCollection==nil){
Channel.title=currentElementData;
}
else{
itemCollection.title=currentElementData;
}
}
else if ([elementName isEqualToString:kPubDate]) {
Channel.pubDate=currentElementData;
}
else if ([elementName isEqualToString: kItemDescription]) {
if(itemCollection!=nil){
itemCollection.itemDescription=currentElementData;
}
}
else if([elementName isEqualToString:@"media:content"]){
if(itemCollection!=nil){
itemCollection.titleImage = currentElementData;
}
}
// [currentElementData release];
self.currentElementData = nil;
}
解析したデータをログとして出力しています。画像がヌルとして表示されています。それ以外はすべて、タイトルと説明が適切に取得されています。どうすれば修正できますか?おそらく didEndElement メソッドで何かを行う必要があります。しかし、私は何を知りません。私は昨日からこれについて頭を悩ませてきました。助けてください!!
didStartElement() にいくつかの変更を加えました。
if ([elementName isEqualToString:kItemImage]) {
NSString *urlString = attributeDict[@"url"];
if(urlString){
[dict setObject:urlString forKey:@"img"];
NSLog(@"%@",urlString);
mString = [NSString stringWithFormat:urlString];
didEndElement() のいくつかの変更:
else if([currentElementData rangeOfString:@"media:content"].location){
if(itemCollection!=nil){
// [currentElementData appendString:dict];
itemCollection.titleImage = mString;
}
}
mString は変更可能な文字列として宣言されています。画像は現在解析中です。それらの URL がログに表示されています。問題は、最後の画像が 2 回繰り返されることです。これはおそらく、最後のフィードに画像がなく、前の画像を使用しているためです。それを修正する方法は?つまり、画像のないフィードが複数存在する可能性があります。その場合、前の画像の URL ではなく、実際には null を表示する必要があります。