XML文件可以包含任何对您的应用程序的基本数据,以一个网站的RSS提要。 他们也可以是一个伟大的方式远程更新您的应用程序内的信息,从而绕过了需要提交一个新的二进制苹果只需添加一个新的的项目列表。
那么,我们如何在Xcode中处理XML文件?
这个过程包含初始化要使用的变量,开始的XML解析器的过程中,喂养过程中的文件,启动一个单独的元素,字符(值)内的元素,一个单独的元素,并最终的步骤解析过程。
在这个例子中,我们将通过它传递给一个特定的网页地址(URL)解析从互联网文件。
我们将开始建设头文件。 这是一个很基本的头文件与解析我们的文件的最低要求的详细信息视图控制器的例子:
@interface RootViewController : UITableViewController {
DetailViewController *detailViewController;
NSXMLParser *rssParser;
NSMutableArray *articles;
NSMutableDictionary *item;
NSString *currentElement;
NSMutableString *ElementValue;
BOOL errorParsing;
}
@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;
- (void)parseXMLFileAtURL:(NSString *)URL;
parseXMLFileAtURL功能将开始为我们的过程。 当它完成,NSMutableArray“细则”将持有我们的数据。 该阵列将与在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, like 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];
// You may need to turn some of these on depending on the type of XML file you are parsing
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];
[rssParser parse];
}
此功能指示发动机在一个特定的网页地址(URL)下载文件,并解析它的启动过程。 我们讲,我们是一个运行在Mac上的Safari以防万一服务器试图重定向移动版本的iPhone / iPad的远程服务器。
在最后的选项是具体到某些XML文件。 大多数RSS文件和通用的XML文件将不再需要它们打开。
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString *errorString = [NSString stringWithFormat:@"Error code %i", [parseError code]];
NSLog(@"Error parsing XML: %@", errorString);
errorParsing=YES;
}
这是一个简单的错误检查路由,将设置一个二进制值,如果它遇到一个错误。 您可能需要更具体的东西,这里取决于你在做什么。 如果你只需要运行后,在错误的情况下处理一些代码,errorParsing二进制变量可以被称为当时
- (void)parser:(NSXMLParser *)parser 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文件中的“项目”的标题下的文件。 在处理的开始,我们正在检查元素的名称“项目”和分配我们的项目字典,当检测到一个新的组。 否则,我们初始化我们的变量值。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[ElementValue appendString:string];
}
这是比较容易的部分。 当我们发现字符,我们简单地将它们添加到我们的变量“ElementValue”。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"item"]) {
[articles addObject:[item copy]];
} else {
[item setObject:ElementValue forKey:elementName];
}
}
当我们处理完一个元素,我们需要做两件事情之一:(1)如果最终元素是“项目”,我们已经完成了本集团,因此,我们将增加我们的字典我们的阵列“文章“。 或(2)如果该元素是不是“项目”,我们将设置一个关键的元素的名称相匹配的价值在我们的字典。 (这意味着我们不需要一个XML文件中的每个字段单独的变量,我们可以处理多一点动态。)
- (void)parserDidEndDocument:(NSXMLParser *)parser {
if (errorParsing == NO)
{
NSLog(@"XML processing done!");
} else {
NSLog(@"Error occurred during XML processing");
}
}
这是我们的分析例程所需的最后一个函数。 它只是结束的文件。 你会提出的任何代码,你想在这里完成的过程中,或什么特别的东西,你可能想要做在错误的情况下。
许多应用程序可能要在这里做的一件事是保存数据和/或设备上的文件的XML文件。 这样,如果用户没有连接到互联网的下一次他们加载的应用程序,他们仍然可以在这个信息。
那么我们该如何运行呢?
当然,我们不能忘记最重要的部分:告诉你的应用程序来解析文件(并赋予它一个网址找到它!)。
启动这一进程,你只需要这行代码添加到适当的地方,你想要做的XML处理:
[self parseXMLFileAtURL:@"http://www.webaddress.com/file.xml"];