iOS - XML解析

前些日子,看到一個同窗在問xml解析的問題,本身也對xml解析瞭解不是不少,都是用了jsno解析。別去學習了一下xml解析。
在收xml解析以前,首先先簡單說一下xml的基本語法。
XML :是Extensible Markup Language的簡寫,全名叫作可擴展標記語言。
簡單的語法以下:
git

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

示例:
需求:北京 晴 最高溫度15℃ 最低溫度5℃
XML實現:

  

 複製代碼

另外一種實現方式: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的: James
擼代碼:性能

- (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…

相關文章
相關標籤/搜索