0

我正在尝试获取包含在 media:content 标签中的雅虎 RSS 提要的 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 已被声明为可变字符串。现在正在解析图像。他们的网址显示在日志中。问题是现在,最后一张图片重复了两次。可能是因为最后一个提要没有图像,所以它使用的是上一张。如何解决?我的意思是,可以有多个没有图像的提要。在这种情况下,它实际上应该显示 null 而不是上一张图片的 url。

4

1 回答 1

0

我不太了解雅虎 rss 提要,但我希望它会对你有所帮助......

试试这个....

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {          

  currentElement = [elementName copy];
  if ([elementName isEqualToString:@"item"]) {
    item = [[NSMutableDictionary alloc] init];
    currentTitle = [[NSMutableString alloc] init];
    currentDate = [[NSMutableString alloc] init];
    currentSummary = [[NSMutableString alloc] init];
    currentLink = [[NSMutableString alloc] init];
    currentImage = [[NSMutableString alloc] init];
 }
 else if([elementName isEqualToString:@"media:content"]) {
         currentImage = [attributeDict objectForKey:@"img src"];
         NSLog(@"Url:%@", currentImage); 
    }
 }
}
于 2013-04-18T18:46:41.123 回答