一个简单的任务是许多应用程序的主干,是解析XML文件的能力。而且,幸运的是,Xcode使得在Objective-C中解析XML文件变得相对容易。
XML文件可以包含从应用程序的基本数据到网站的RSS源的任何内容。它们也是远程更新应用程序中信息的好方法,因此无需向Apple提交新的二进制文件,只需将新项目添加到列表中即可。
那么我们如何在Xcode中处理XML文件呢?该过程包含初始化要使用的变量,启动XML解析器进程,为该进程提供文件,单个元素的开始,元素中的字符(值),单个元素的结尾以及结束的步骤解析过程。
在这个例子中,我们将通过传递特定的Web地址(URL)来解析来自Internet的文件。
我们将从构建头文件开始。这是详细视图控制器的一个非常基本的头文件的示例,其中包含解析文件的最低要求:
@interface RootViewController:UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;NSMutableArray *文章;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property(非原子,保留)IBOutlet DetailViewController * detailViewController; - (void)parseXMLFileAtURL:(NSString *)URL;parseXMLFileAtURL函数将为我们启动进程。完成后,NSMutableArray“文章”将保存我们的数据。该数组将由可变字典组成,其中的键与XML文件中的字段名称相关。 现在我们已经设置了所需的变量,我们将继续讨论.m文件中的进程:
- (void)parserDidStartDocument:(NSXMLParser *)parser {NSLog(@“找到并解析文件”);} 此功能在流程开始时运行。没有必要在此函数中放置任何内容,但如果要在文件开始解析时执行任务,则可以在此处放置代码。
- (void)parseXMLFileAtURL:(NSString *)URL{NSString * agentString = @“Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_5_6; en-us)AppleWebKit / 525.27.1(KHTML,类似Gecko)Version / 3.2.1 Safari / 525.27.1”;NSMutableURLRequest * request = NSMutableURLRequest requestWithURL:NSURL URLWithString:URL;request setValue:agentString forHTTPHeaderField:@“User-Agent”;xmlFile = NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil;articles = NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData:xmlFile;rssParser setDelegate:self;//您可能需要根据要解析的XML文件的类型启用其中一些rssParser setShouldProcessNamespaces:NO;rssParser setShouldReportNamespacePrefixes:NO;rssParser setShouldResolveExternalEntities:NO;rssParser parse;} 此函数指示引擎下载特定Web地址(URL)上的文件并启动解析它的过程。我们告诉远程服务器我们是在Mac上运行的Safari,以防服务器尝试将iPhone / iPad重定向到移动版本。最后的选项特定于某些XML文件。大多数RSS文件和通用XML文件都不需要打开它们。
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {NSString * errorString = NSString stringWithFormat:@“错误代码%i”,parseError代码;NSLog(@“解析XML:%@”时出错,errorString);errorParsing = YES;}这是一个简单的错误检查路由,如果遇到错误,将设置二进制值。根据您的工作,您可能需要更具体的内容。如果您只是需要在处理错误的情况下运行一些代码,那么可以在那时调用errorParsing二进制变量。
- (void)解析器:(NSXMLParser *)解析器didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;if(elementName isEqualToString:@“item”){item = NSMutableDictionary alloc init;}} XML解析器的内容包含三个函数,一个在单个元素的开头运行,一个在解析元素的过程中运行,另一个在元素的末尾运行。 对于此示例,我们将解析类似于RSS文件的文件,该文件将元素分解为XML文件中“items”标题下的组。在处理开始时,我们检查元素名称“item”并在检测到新组时分配我们的项目字典。否则,我们初始化值的变量。
- (void)解析器:(NSXMLParser *)解析器foundCharacters:(NSString *)string {ElementValue appendString:string;} 这是简单的部分。当我们找到字符时,我们只需将它们添加到变量“ElementValue”中。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {if(elementName isEqualToString:@“item”){article addObject:item copy;} else {item setObject:ElementValue forKey:elementName;}} 当我们完成一个元素的处理时,我们需要做两件事之一:(1)如果end元素是“item”,我们已经完成了我们的组,所以我们将把我们的字典添加到我们的文章数组中”。或者(2)如果元素不是“item”,我们将使用与元素名称匹配的键在字典中设置值。 (这意味着我们不需要XML文件中每个字段的单个变量。我们可以更动态地处理它们。)
- (void)parserDidEndDocument:(NSXMLParser *)解析器{if(errorParsing == NO){NSLog(@“XML处理完成!”);} else {NSLog(@“XML处理期间发生错误”);}} 这是我们解析例程所需的最后一个函数。它只是结束了文件。您可以在此处输入您想要完成此过程的任何代码,或者在出现错误时可能需要执行的任何特殊操作。 许多应用程序可能想要做的一件事是将数据和/或XML文件保存到设备上的文件中。这样,如果用户下次加载应用时未连接到Internet,他们仍然可以获取此信息。 当然,我们不能忘记最重要的部分:告诉你的应用程序解析文件(并给它一个网址来找到它!)。 要启动该过程,您只需将此行代码添加到要进行XML处理的适当位置:
self parseXMLFileAtURL:@“http://www.webaddress.com/file.xml”;