如何在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”];