我用Google搜索了一下,但在这个问题上找不到很多。我有一个RSS提要的URL,我想知道如何以NSDictionary的形式将该内容放入我的应用程序。我可以使用NSData的initWithContentsOfURL吗?
答案 0 :(得分:8)
你需要两件事:
Apple文档包含许多使用NSURLConnection
从Web服务检索数据的示例。 Apple文档中提供了大量示例。以下是要点。
首先,您需要使用正确的URL初始化连接并启动它。下面的代码显示了如何执行此操作:
// Create a URL for your rss feed
NSURL *url = [NSURL URLWithString:@"http://yourrssfeedurl"];
// Create a request object with that URL
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:30];
// Clear the existing connection if there is one
if (connectionInProgress) {
[connectionInProgress cancel];
[connectionInProgress release];
}
// Instantiate the object to hold all incoming data
[receivedData release];
receivedData = [[NSMutableData alloc] init];
// Create and initiate the connection - non-blocking
connectionInProgress = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
在此代码中,connectionInProgress
是执行连接的类中定义的NSURLConnection
类型的ivar。
然后你需要实现NSURLConnectionDelegate方法:
// This method is called everytime the current connection receives data
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[receivedData appendData:data];
}
// This method is called once the connection is completed
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *xmlCheck = [[[NSString alloc] initWithData:receivedData
encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"xmlCheck = %@", xmlCheck);
// Release our memory: we're done!
[connectionInProgress release];
connectionInProgress = nil;
[receivedData release];
receivedData = nil;
}
// This method is called when there is an error
-(void) connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
[connectionInProgress release];
connectionInProgress = nil;
[receivedData release];
receivedData = nil;
NSString *errorString = [NSString stringWithFormat:@"Fetch failed: %@", [error localizedDescription]];
NSLog(@"%@", errorString);
}
在上面的代码中,receivedData
是在执行连接的类中定义的NSMutableData
类型的ivar。
使用NSXMLParser
类解析刚刚检索到的xml文件非常简单。
调用解析器的类需要实现NSXMParserDelegate
协议。这是在处理解析的对象的.h中完成的(本例中为DataManager):
@interface DataManager : _DataManager <NSXMLParserDelegate>
{
}
在实现文件中,您至少需要实现以下方法:
每次在xml文件中找到新的XML标记时,该方法都会调用。这通常是您要定义新对象的位置,以便您可以在读取属性时设置它们的属性,或者清除用于存储XML文件中找到的字符的字符串。
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
每次解析器在文件中找到字符(而不是元素名称)时,都会调用该方法。这里currentElementString
是一个'NSMutabletring'类型的ivar。
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
[currentElementString appendString:string];
}
完成读取元素时调用的最后方法。这通常是您将任何完全解析的元素存储到数据结构层次结构(字典或其他)中的地方:
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
当您告诉解析器这样做时,解析就会开始。这是一个同步调用,即它会阻止你的应用程序,直到解析结束。以下是定义解析器并调用它的方法:
// Create an XML parser with the data received from the web service
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// Give the parser delegate
[parser setDelegate:self];
// Tell the parser to start parsing - The complete document will be parsed and the delegate to
// of NSXMLParser will get all of its delegate messages sent to it before this line finishes
// execution. The parser is blocking.
[parser parse];
// Parser has finished its job, release it
[parser release];
最后一条建议。通常,你会在didStartElement和didEndElement方法中有一个很大的if ... else if语句,你需要将elementName与你期望的元素的名称进行比较。建议使用常量字符串定义,您可以在两种方法中使用,而不是在方法中键入字符串。这意味着:
static NSString *ks_ElementName1 = @"ElementName1";
应该在didStartElement和didEndElement方法中声明和使用来标识XML中的“ElementName1”。
Voilà,祝你的应用好运。
答案 1 :(得分:2)
关于使用NSXMLParser -(void)initWithContentsOfURL:(NSURL *)url
而不是使用NSURLConnection
加载数据的一个注意事项。 NSURLConnection
是非阻塞的,将数据加载到由其自身管理的单独线程中,在需要时调用已定义的委托。相反,如果在主线程上调用,NSXMLParser initWithContentsOfURL
方法将被阻止。
答案 2 :(得分:0)
查看NSXMLParser类的文档。您可以使用initWithContentsofURL然后按照您认为合适的方式操作数据。
答案 3 :(得分:0)
我曾经开始过一个涉及类似事情的项目,因为无关的原因而被放弃了。您应该查看NSXMLParser (documentation link)来解析XML Feed。您可以轻松地分解元素并将其添加到您喜欢的任何数据结构中。