在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");
}
}
~~~
- 前言
- (一)——ios搭建開發環境
- (二)——Hello iOS
- (三)——iOS系統架構
- (四)——iOS應用程序生命周期
- (五)——UI基礎UIWindow、UIView
- (六)——ViewController
- (七)——UI基礎UIButton
- (八)——iOS網絡通信http之NSURLConnection
- (九)—— xml數據解析
- (十)——iOS真機調試
- (十一)——JSON數據解析
- (十二)——iOS國際化
- (十三)——獲取手機信息(UIDevice、NSBundle、NSLocale)
- (十四)——打電話、發短信
- (十五)——數據庫操作(SQLite)
- (十六)——數據庫操作(使用FMDB)
- (十七)——文件操作(NSFileManager)
- Swift初學習