xml文件解析辦法
xml是為了提高web數據交換量而出現的,雖然他現在web應用中并不廣泛,但是由于他的格式良好,經(jīng)常被用做配置文件的格式。比如tomcat的主配置文件server.xml,web.xml等等。
首先我們看一下需求。我們的目的主要是提取xml文件中的特定內容,又因為xml文件本身的格式良好,這種查詢(xún)是非常有規律的,非常有利于我們 找到需要的信息。有時(shí)我們還可能把特定信息寫(xiě)回xml中,但是這種需求并不是必需的,因為配置文件都不會(huì )太大,我們完全可以通過(guò)手工辦法進(jìn)行修改。
對xml進(jìn)行解析的標準有兩種,sax以及dom。
首先這兩種標準并不是針對java的,他們在各種語(yǔ)言環(huán)境下都可以實(shí)現。dom是真正的國際標準。sax是事實(shí)的標準,他不由任何商業(yè)組織維 護,而是由一個(gè)非商業(yè)的組織在運作。就像iso7層模型和tcp/ip一樣,雖然sax不是正式的標準,但是一點(diǎn)不影響他在xml解析領(lǐng)域的地位。
dom實(shí)現的原理是把整個(gè)xml文檔一次性讀出,放在一個(gè)樹(shù)型結構里。在需要的時(shí)候,查找特定節點(diǎn),然后對節點(diǎn)進(jìn)行讀或寫(xiě)。他的主要優(yōu)勢是實(shí)現簡(jiǎn)單,讀寫(xiě)平衡;缺點(diǎn)是比較占內存,因為他要把整個(gè)xml文檔都讀入內存,文件越大,這種缺點(diǎn)就越明顯。
sax的實(shí)現方法和dom不同。他只在xml文檔中查找特定條件的內容,并且只提取需要的內容。這樣做占用內存小,靈活,正好滿(mǎn)足我們的需求。他的缺點(diǎn)就是寫(xiě),有些資料介紹了寫(xiě)入的方法,但是我感覺(jué)這對本例沒(méi)有必要。
NSXMLParser 實(shí)現的是sax方法解析xml文件。
Introduction
NSXMLParser is a forward only reader or an event driven parser. What it means is, an event is raised whenever the parser comes across a start of an element, value, CDATA and so on. The delegate of NSXMLParser can then implement these events to capture XML data. Some of the events are raised multiple times like the start of an element, value of an element and so on. Since NSXMLParser is known as an event driven parser, we can only read data at the present node and cannot go back. The iPhone only supports NSXMLParser and not NSXMLDocument, which loads the whole XML tree in memory.For example, say you have a simple XML file such as the following:
<?xml version= "1.0" encoding="UTF8"> |
<article author="John Doe"> |
<para>This is a very short article.</para> |
</article> |
The parser would report the following series of events to its delegate:
Started parsing document
Found start tag for element article ---<article >
Found attribute author of element article, value “John Doe”-----author="John Doe"
Found start tag for element para -----<para>
Found characters ------This is a very short article. 【 element's value】
Found end tag for element para------</para>
Found end tag for element article----</article>
Ended parsing document
使用NSXMLParser步驟方法如下:
步驟一,確定從xml文件 解析出來(lái)的數據如何保存--定義一個(gè)類(lèi)(結構體)
小提示:可能一個(gè)xml文件解析出的數據包含多個(gè)對象,可以用NSMutableArray來(lái)保存。如參考一中提到的books
步驟二,自定義解析處理方法(主要三個(gè)方法)--Delegate代理
為了使代碼清晰 可以單獨提出來(lái)作為一個(gè)類(lèi)
方法一:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict {
/*
* 處理一:start tag for element 根據不同的元素名,創(chuàng )建不同的用于保存對應數據信息的對象(結構體)
* 處理二:attribute of the element 保存數據信息到對象(結構體)
*/
if([elementName isEqualToString:@"Books"]) {
//Initialize the array.
appDelegate.books = [[NSMutableArray alloc] init];
}
aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];
}
方法二:主要處理element's value 主要一般都是如下處理保存value值到字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];
NSLog(@"Processing Value: %@", currentElementValue);
}
方法三:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
/*
*處理end tag for element,判斷不同的元素名,給予不同的處理 保存
*/
if([elementName isEqualToString:@"Book"]) {
[appDelegate.books addObject:aBook];
[aBook release];
aBook = nil;
}
}
步驟三 獲取xml文件,并建立NSXMLParser對象,后解析
如參考一中實(shí)例,從url獲取xml文件,并實(shí)例化NSXMLParser對象
NSURL *url = [[NSURL alloc] initWithString:@"http://sites.google.com/site/iphonesdktutorials/xml/Books.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
//Initialize the delegate.實(shí)例化解析處理方法的代理(步驟二中定義的代理)
XMLParser *parser = [[XMLParser alloc] initXMLParser];
//Set delegate 設置NSXMLParser對象的解析方法代理
[xmlParser setDelegate:parser];
//Start parsing the XML file.調用代理解析NSXMLParser對象
BOOL success = [xmlParser parse];
if(success)
NSLog(@"No Errors");
else
NSLog(@"Error Error Error!!!");
/*********************
*that all
/*********************