在iPhone開發中,XML的解析有很多選擇,iOS SDK提供了NSXMLParser和libxml2兩個類庫,另外還有很多第三方類庫可選,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。這篇文章使用了NSXMLParser。
解析 XML 通常有兩種方式,DOM 和 SAX:
- DOM解析XML時,讀入整個XML文檔並構建一個駐留記憶體的樹結構(節點樹),通過遍曆樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以藉助XPath,直接查詢XML節點。
- SAX解析XML,是基於事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔載入完之後才採取操作,當在讀取解析過程中遇到需要處理的對象,會發出通知對其進行處理。
NSXMLParser是基於SAX的解析方式。NSXMLParser採用了委託設計模式,因此他的實作類別需要採用協議並支援委託。NSXMLParser解析XML需要委託NSXMLParserDelegate實現。
1、初始化NSXMLParser
要使用NSXMLParser要先建立它,設定各種屬性,主要用到以下幾個方法:
initWithContentsOfURL 通過NSURL建立解析器
initWithData 通過NSData建立解析器
setDelegate 為解析器定義委託
parse 運行解析器
NSXMLParser *parser=[[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]]; // NSXMLParser *parser=[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]]; [parser setDelegate:self];//設定NSXMLParser對象的解析方法代理 [parser setShouldProcessNamespaces:NO]; [parser parse];//開始解析
2、委託方法
主要使用一下委託方法:
//發現元素開始符的處理函數 (即報告元素的開始以及元素的屬性) - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict//處理標籤包含內容字元 (報告元素的所有或部分內容) - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string//發現元素結束符的處理函數,儲存元素各項目資料(即報告元素的結束標記)- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName//報告解析的結束 - (void)parserDidEndDocument:(NSXMLParser *)parser//報告不可恢複的解析錯誤- (void)paser:parserErrorOccured
執行[parser parse]後會依序執行:
1、didStartElement
2、foundCharacters
3、didEndElement
樣本如下:
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"xml_parser start %@ ",elementName); if ( [elementName isEqualToString:@"person"] ) { NSLog(@"xml_parser person "); if(personNameArrary==nil){ personNameArrary=[[NSMutableArray alloc] init]; } } if(itemValue!=nil){ itemValue=nil; } itemValue=[[NSMutableString alloc] init]; if ( [elementName isEqualToString:@"phone"] ) { NSString *atr=[attributeDict valueForKey:@"type"]; NSLog(@"xml_parser phone type: %@",atr); }}- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"xml_parser value:%@",string); [itemValue appendString:string];}- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"xml_parser end %@ ",elementName); if ( [elementName isEqualToString:@"firstName"] ) { [personNameArrary addObject:itemValue]; } if ( [elementName isEqualToString:@"person"] ) { NSLog(@"xml_parser person end"); } }
NSXMLParser DEMO 下載
/**
* @author 張興業* http://blog.csdn.net/xyz_lmn* iOS入門群:83702688
* android開發進階群:241395671
* 我的新浪微博:@張興業TBOW*/
參考:
http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/XMLParsing/Articles/HandlingElements.html#//apple_ref/doc/uid/20002265-BCIJFGJI
http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project#