2010-03-18 105 views
5

我正在使用NSXMLParser从订阅源获取新的RSS故事,并将它们显示在UITableView中。但是现在我只想拍摄这些图像,并将它们显示在UIScrollView/UIImageView中(3幅图像并排)。我完全失去了。我正在使用以下代码从URL中获取1个图像。iPhone开发:从RSS订阅源获取图像

NSURL *theUrl1=[NSURL URLWithString:@"http://farm3.static.flickr.com/2586/4072164719_0fa5695f59.jpg"]; 
JImage *photoImage1=[[JImage alloc] init]; 
[photoImage1 setContentMode:UIViewContentModeScaleAspectFill]; 
[photoImage1 setFrame:CGRectMake(0, 0, 320, 170)]; 
[photoImage1 initWithImageAtURL:theUrl1]; 
[imageView1 addSubview:photoImage1]; 
[photoImage1 release]; 

这是我所完成的一切,它对一个图像起作用,我必须指定确切的URL。你会推荐我做什么来完成这件事?

回答

0

听起来好像您需要首先识别标识xml文档中图像的xml标签。您应该可以通过在浏览器地址栏中输入正在使用的任何API调用来完成此操作。

一旦你这样做了,你可以从接收新数据的nsxmlparser委托方法中创建一个映像URL数组。

一旦你的阵列图像的URL,你可以做同样的事情,以你在做什么,所不同的是,你会用NSURL * theUrl1 = [myArray的objectAtIndex:...

你可以通过安排图像改变他们的中心位置:image.center = CGPointMake(160,240)..

希望有帮助。有nsxmlparser的苹果文档。

+0

URL是动态的,因为我使用的是feedburner,这可以与“any”rss feed一起使用吗?谢谢! – 2010-03-19 20:47:58

+0

不确定你的意思是'网址是动态的'。但只要在xml文档中有一个标签来标识图像url,就应该适用于任何xml文档。 – Remover 2010-03-20 20:47:18

+0

由此我的意思是所有的图像托管在不同的地方... – 2010-03-26 19:57:41

0

您还可以在从API调用中获取数据时尝试字典实现。首先,您必须识别xml标签,用于识别xml文档中的图像,然后您可以将每个图像及其相应的故事作为图像的关键字分配到字典中。它将确保对于特定的故事只显示其关联的图像。然后,随着需求的变化,你可以稍后在应用程序中使用这些信息。

NSMutableDictionary * mutDict = [[NSMutableDictionary allloc] init]; if([elementName isEqualToString:@“story_image”]) {[mutDict setObject:currentImage forKey:currentStory]; }

我想建议您使用JSON而不是xml,因为它是轻量级数据交换 格式。这将节省很多格式和努力。

+0

我绝对愿意给JSON一个尝试,但是我不知道该怎么做。笑 – 2010-03-26 19:57:08

+0

你可以访问此页面 http://code.google.com/p/json-frame 这肯定会帮助你。 您必须下载该框架,然后在您的应用程序中使用。 要获取实时数据,您必须执行与XMLParsing中相同的操作 NSString * jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSDictionary * JDict = [jsonString JSONValue]; 或 NSArray * JArr = [jsonString JSONValue]; 取决于您的数据源包含的内容。 – 2010-03-30 07:53:45

0

您可以访问此页面 http://code.google.com/p/json-frame

这肯定会帮助你。 您必须下载该框架,然后在您的应用程序中使用。
为了让你必须做同样的事情的实时数据,如XMLParsing

NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; 


    NSDictionary *JDict = [jsonString JSONValue]; 

NSArray * JArr = [jsonString JSONValue]; 

取决于你的数据Feed中包含。

+0

我已经将JSON框架添加到了我的项目中,但是我不知道我会如何从RSS提要中提取图像......您可以通过电子邮件发送消息来消除StackOverflow中间人?我的地址是[email protected]谢谢 – 2010-03-31 00:29:51

0

我一直在使用NSXMLParser并使用CoreData存储结果。我使用他的CoreData example代码中的BjörnSållarp的分析器类的一个版本。

我的图像在SQLite数据库中以NSData/Binary结尾,但它们也可能放入UIImage数组中以便立即显示。从Parser.m

提取:(由比约恩Sållarp)

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{  

    if ([elementName isEqualToString:@"imagetag"]) 
    { 
     UIImage *newImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:currentString]]]; 

     NSData *imageData = UIImagePNGRepresentation(newImage); 

     [currentSearchResult setImage:imageData]; 

     currentString = nil; 
     return; 
    } 

从我的观点与调用:

NSString *searchURL = @"http://www.feedurl.com/feed/address/feed.xml"; 
NSURL *xmlURL = [NSURL URLWithString:searchURL]; 

Parser *xmlParse = [[Parser alloc] initWithContext:managedObjectContext]; 
[xmlParse parseXMLFileAtURL:xmlURL parseError:&parseError]; 

该代码假设你的XML文档中包含图片网址与标签格式:

<imagetag>http://example.com/path/to/image.png</imagetag> 

即使你不使用CoreData,通过该链接的示例工作将是使用NSXMLParser处理XML的指导。

3

除了我的另一个答案,它使用了一些辅助类,并假设你正在存储的东西与核心数据,这是一个纯NSXMLParser的方式来做到这一点。

在这个例子中,我假设你有三个UIImageView设置标签(100,101,102),所以我们可以访问它们。首先,启动解析器代码:

// Set the URL with the images, and escape it for creating NSURL 
    NSString *rssURLString = @"http://feeds.gettyimages.com/channels/RecentEditorialEntertainment.rss"; 
    NSString *escapedURL = [rssURLString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
    NSURL *rssURL = [NSURL URLWithString:escapedURL]; 

    // rssParser is an NSXMLParser instance variable 
    if (rssParser) [rssParser release];  
    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:rssURL]; 
    [rssParser setDelegate:self]; 
    success = [rssParser parse]; // return value not used 

此时解析开始和的NSXMLParser会发现在XML不同的开始和结束元素火了它的委托方法的调用。

在这个例子中,我只写didStartElement方法:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    // look for an attribute called url 
    if ([attributeDict objectForKey:@"url"]) { 

     currentString = [attributeDict objectForKey:@"url"];   
     NSLog(@"Image URL: %@", currentString); 

     NSString* escapedURL = [currentString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
     UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:escapedURL]]];   

     UIImageView * tmpImageView = (UIImageView*)[scrollView viewWithTag:100+imageCount]; 
     [tmpImageView setImage:image]; 

     NSLog(@"images found: %d", imageCount); 
     imageCount++;  
     if (imageCount>2) [rssParser abortParsing];  
    } 
} 

下面我们看一下,看是否attributeDict(一个NSDictionary对象)包含一个URL属性。如果是这样,我们将它抓到currentString然后转义它,只是说它有NSURL会禁止的字符。然后我们从该URL创建一个图像,并根据标签号码设置适当的UIImageView图像。 imageCount是一个计数器;一旦我们完成了三张图片,我们就告诉NSXMLParser放弃解析XML。

如果你的XML会将URL元素标签内,如:

<image>http://example.com/image.jpg</image> 

你需要做更多的工作与didEndElementfoundCharacters。看到相当优秀的Introduction to Event-Driven XML Programming Guide for Cocoa

我敲了一个快速和肮脏的应用程序来演示这个,你可以抓住它here