如何在Xcode中解析XML文件

一个简单的任务是许多应用程序的支柱是解析XML文件的能力。 幸运的是,Xcode使得在Objective-C中解析XML文件变得相对容易。

XML文件可以包含关于您的应用的基本数据到网站的RSS提要的任何内容。 它们也可以是远程更新应用程序内信息的好方法,从而绕过了向Apple提交新的二进制文件的需求,只需将新项目添加到列表即可。

那么我们如何在Xcode中处理XML文件?这个过程包含以下步骤:初始化要使用的变量,启动XML解析器过程,为该过程提供文件,单个元素的开始,元素中的字符(值)单个元素的结尾以及解析过程的结束。

在这个例子中,我们将通过传递一个特定的Web地址( URL )来解析来自Internet的文件。

我们将开始构建头文件。 这是Detail View Controller的一个非常基本的头文件的例子,它具有解析我们文件的最低要求:

@interface RootViewController:UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray *文章;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property(nonatomic,retain)IBOutlet DetailViewController * detailViewController;

- (void)parseXMLFileAtURL:(NSString *)URL;

parseXMLFileAtURL函数将为我们启动该过程。 完成后,NSMutableArray“articles”将保存我们的数据。 该数组将由可变词典组成,其密钥与XML文件中的字段名称相关。

现在我们已经设置了所需的变量,我们将继续讨论.m文件中的过程。

- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@“File found and parsing started”);

}

该功能在流程开始时运行。 没有必要在这个函数中放置任何东西,但是如果你想在文件开始解析时执行一个任务,这就是你放置代码的地方。

- (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];

}

该功能指示引擎在特定网址(URL)下载文件并开始解析该文件。

我们告诉远程服务器我们是在Mac上运行的Safari,以防服务器试图将iPhone / iPad重定向到移动版本。

最后的选项特定于某些XML文件。 大多数RSS文件和通用XML文件不需要打开它们。

- (void)解析器:(NSXMLParser *)解析器parseErrorOccurred:(NSError *)parseError {

NSString * errorString = [NSString stringWithFormat:@“错误代码%i”,[parseError code]];
NSLog(@“错误解析XML:%@”,errorString);


errorParsing = YES;
}

这是一个简单的错误检查路由,如果遇到错误,它将设置一个二进制值。 根据你在做什么,你可能需要更具体的东西。 如果您在处理完错误后只需要运行一些代码,则可以在那个时候调用errorParsing二进制变量。

(NSXMLParser *)解析器didStartElement:(NSString *)
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)解析器:(NSXMLParser *)解析器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”,那么我们完成了我们的组,所以我们将我们的字典添加到我们的“articles ”。

或者(2)如果元素不是“item”,我们将使用与元素名称匹配的关键字在我们的字典中设置值。 (这意味着我们不需要为XML文件中的每个字段提供单独的变量,我们可以更加动态地处理它们。)

- (void)parserDidEndDocument:(NSXMLParser *)parser {

如果(errorParsing == NO)
{
NSLog(@“XML processing done!”);
} else {
NSLog(@“在XML处理期间发生错误”);
}

}

这是我们解析例程所需的最后一个函数。 它只是结束文件。 你会把你想要完成这个过程的任何代码放在这里,或者在错误的情况下你想要做的任何特殊的事情。

许多应用程序可能想要在这里执行的一件事是将数据和/或XML文件保存到设备上的文件中。 这样,如果用户在下次加载应用程序时未连接到Internet,他们仍然可以获取此信息。

当然,我们不能忘记最重要的部分:告诉你的应用程序解析文件(并给它一个网址以便找到它!)。

要开始该过程,只需将此代码行添加到要执行XML处理的适当位置即可:

[self parseXMLFileAtURL:@“http://www.webaddress.com/file.xml”];