前些日子,看到一個同窗在問xml解析的問題,本身也對xml解析瞭解不是不少,都是用了jsno解析。別去學習了一下xml解析。
在收xml解析以前,首先先簡單說一下xml的基本語法。
XML :是Extensible Markup Language的簡寫,全名叫作可擴展標記語言。
簡單的語法以下:
git
複製代碼
另外一種實現方式:github
複製代碼 北京 晴 15 5
以上就是簡單的xml的基本語法。下面開始說iOS中xml的解析的事。
關於XML,有兩種解析方式,分別是SAX(Simple API for XML,基於事件驅動的解析方式,逐行解析數據,採用協議回調機制)和DOM(Document Object Model ,文檔對象模型。解析時須要將XML文件總體讀入,而且將XML結構化成樹狀,使用時再經過樹狀結構讀取相關數據,查找特定節點,而後對節點進行讀或寫)。蘋果官方原生的NSXMLParse類庫採用第一種方式,即SAX方式解析XML,它基於事件通知的模式,一邊讀取文檔一邊解析數據,不用等待文檔所有讀入之後再解析,因此若是你正打印解析的數據,而解析過程當中間出現了錯誤,那麼在錯誤節點之間的數據會正常打印,錯誤後面的數據不會被打印。解析過程由NSXMLParserDelegate協議方法回調。在這裏,咱們主要講iOS原生的解析方式,就是使用NSXMLParserDelegate協議方法回調。
首先使用這個瞭解這個協議的代理方法:微信
//準備解析 -(void)parserDidStartDocument:(NSXMLParser *)parser; //準備解析當前節點 -(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; 複製代碼
簡單介紹完代理後,進行寫demo。
解析第一個xml的:
擼代碼:性能
- (IBAction)onParse:(id)sender { NSString *xmlStr1 = @"James "; NSData *xmlData = [xmlStr1 dataUsingEncoding:NSUTF8StringEncoding]; //初始化NSXMLParser,並遵循協議 NSXMLParser *xmlParaser = [[NSXMLParser alloc]initWithData:xmlData]; xmlParaser.delegate = self; //開始解析 [xmlParaser parse]; } //準備解析 -(void)parserDidStartDocument:(NSXMLParser *)parser{ _label.text = [_label.text stringByAppendingString:@"準備解析"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //準備解析當前節點 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary*)attributeDict{ _label.text = [_label.text stringByAppendingString:@"準備解析當前節點"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //獲取首尾節點間內容 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ _label.text = [_label.text stringByAppendingString:string]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //解析完當前節點 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ _label.text = [_label.text stringByAppendingString:@"解析完當前節點"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //解析結束 -(void)parserDidEndDocument:(NSXMLParser *)parser{ _label.text = _label.text = [_label.text stringByAppendingString:@"解析結束"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } @end 複製代碼
運行結果:
學習
第二個例子:解析:
直接擼代碼:大數據
- (IBAction)onParse:(id)sender { // NSString *xmlStr1 = @"James "; NSString *xmlStr2 = @""; NSData *xmlData = [xmlStr2 dataUsingEncoding:NSUTF8StringEncoding]; NSXMLParser *xmlParaser = [[NSXMLParser alloc]initWithData:xmlData]; xmlParaser.delegate = self; [xmlParaser parse]; } //準備解析 -(void)parserDidStartDocument:(NSXMLParser *)parser{ _label.text = [_label.text stringByAppendingString:@"準備解析"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //準備解析當前節點 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ _label.text = [_label.text stringByAppendingString:@"準備解析當前節點"]; _label.text = [_label.text stringByAppendingString:elementName]; _label.text = [_label.text stringByAppendingString:@"\n"]; _label.text = [_label.text stringByAppendingString:[attributeDict objectForKey:@"name"]]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //獲取首尾節點間內容 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ _label.text = [_label.text stringByAppendingString:@"獲取首尾節點間內容"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //解析完當前節點 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ _label.text = [_label.text stringByAppendingString:@"解析完當前節點"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } //解析結束 -(void)parserDidEndDocument:(NSXMLParser *)parser{ _label.text = _label.text = [_label.text stringByAppendingString:@"解析結束"]; _label.text = [_label.text stringByAppendingString:@"\n"]; } @end 複製代碼
運行結果:
spa
另外一種的解析,可使用GDataXML第三方進行解析。這裏再也不詳細說。.net
最後總結:
xml兩種解析SAX和DOM,各有優點,好比在應對比較大數據量的XML文件時,後者因爲須要先讀取整個文檔,性能和速度上就必然不及前者了。解析小數據量的時候使用DMO更加高效,你們能夠根據數據量的多少進行合理選擇。3d
以上就是xml的簡單解析。再次感謝慕課網(www.imooc.com/)。
以上若有錯誤,請指出,很是感謝。代理
微信公衆號:不靠譜程序猿 微信公衆號:Sheffi_Programmer
Github:Sheffi(github.com/goingmyway1…
新浪微博:Sheffi567
掘金:Sheffi(gold.xitu.io/user/57c137…
博客地址:blog.csdn.net/qq_34195670…