iOS 網路資料之XML解析

2021-06-23 07:15:18 字數 2574 閱讀 2863

向伺服器請求資料,那麼資料必須以某個特定的格式存放,然後一方把資料按這種格式組織起來,另一方按相同的方式把資料解析數來,就像是我們人之間講話交流,我們的話會轉變成振動、在空氣中傳播、然後對方的耳朵感受這種振動,然後把振動轉化為話,所以我認為格式的組織是為了更好的傳遞資料。一般網路資料會封裝成兩種格式進行傳遞:

xml和

json。

1、」解析「:

xml長得和html很像,開啟瀏覽器的顯示原始碼功能,可以看到一串串的<>標籤,而解析xml也依靠於這些標籤。首先說下我理解的「解析」,不管是xml還是json,實際就是一大段字串,解析就是按xml或json的格式規範把這個字串變成字典或陣列,這樣才能自由的獲取裡面的資料。比如:

晴轉多雲

微風34 ~ 23℃

weather標籤裡面是」晴轉多雲「,就是說天氣是晴轉多雲,那麼這就是字典裡面的乙個鍵值對,weather是鍵,晴轉多雲是值。xml、json和陣列字典都是組織資料的東西,「解析」就是把資料從某種組織格式轉為另一種。

2、dom和sax:

這是xml的兩種解析方式,dom是把xml文件整個的載入,對於這個文件裡資料的結構都清楚了;然後可以使用xpath直接獲取某個節點;而sax是從xml頭部逐條逐個標籤的向下讀,遇到乙個什麼東西就通知一下,所以它不需要xml文件已經全部獲取,但是它只管得了當前讀到的地方,前面讀過的就取不到了,所以在結構上不是很清楚,但是相對快速、耗記憶體小。個人覺得dom解析操作起來更方便一些。

3、關於解析類庫的選擇:

參看文章:ios平台xml解析類庫對比概述

4、系統的nsxmlparser的使用:

(1)獲取資料:

-(void )getxmldata

(2)構建nsxmlparser:

-(void )parserxmldata

}

這裡是使用nsdata物件構建,也可以使用文件資源位址構建- (id)initwithdata:(nsdata

*)data、使用輸入流構建:- (id)initwithstream:(nsinputstream

*)stream。呼叫parse開啟解析。需要設定委託物件,這樣在解析到某個元素變遷或是字元的時候,會讓委託物件呼叫委託方法,而就是在這些方法裡面進行資料的處理。

(3)委託方法:

-(void )parserdidstartdocument:(nsxmlparser *)parser

-(void)parser:(nsxmlparser *)parser didstartelement:(nsstring *)elementname namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring *)qname attributes:(nsdictionary *)attributedictelse if ([_currentelement isequaltostring:@"date"]&&_weatherarray)

}-(void )parser:(nsxmlparser *)parser foundcharacters:(nsstring *)stringelse if ([_currentelement isequaltostring:@"daypictureurl"])else if ([_currentelement isequaltostring:@"nightpictureurl"])else if ([_currentelement isequaltostring:@"weather"])else if ([_currentelement isequaltostring:@"wind"])else if ([_currentelement isequaltostring:@"temperature"])

}}-(void )parser:(nsxmlparser *)parser foundcdata:(nsdata *)cdatablock

-(void )parser:(nsxmlparser *)parser didendelement:(nsstring *)elementname namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring *)qname

-(void )parserdidenddocument:(nsxmlparser *)parser

上面列舉了一些解析過程中呼叫的委託方法,還有許多其他方法,參考文件中nsxmlparserdelegate。似乎方法很詳細,把解析過程的每個細節的考慮到了,但是感覺把xml中的資料合理的存放到陣列字典裡,真不是件容易的事,不想json,一句話就搞定了。sax解析最大的不便是,當解析到某個標籤的時候,你不知道它上一層的標籤是什麼,更不知道上上層的標籤是什麼,也就是說沒有東西能告訴你整個文件的結構是什麼樣的。上面的例子是將鏈結中獲得的天氣xml文件中天氣的部分取出來放進陣列_weatherarray裡面,也就是

...這個標籤內的內容。

sax解析總的來說,不是很方便,如果資料的層次結構比較複雜,處理起來會很麻煩,所以要考慮dom解析和json格式。

iOS之資料解析之XML解析

xml解析常見的兩種方式 dom解析和sax解析 dom解析 解析 如下 void xmldommethed nslog self sourcearray 寫入 如下 通過dom解析方式為xml增加節點 sax只可以讀取,不可以新增 void domaddnote sax解析 遵循協議 inte c...

iOS開發之XML解析

最近用到網路請求,整理一下。資料結構 inte ce viewcontroller property nonatomic,strong nsmutablearray datalist 拼接字串 property nonatomic,strong nsmutablestring elementstri...

iOS開發之XML解析

有如上xml檔案 xml解析 分為兩種方式 sax解析和dom解析。sax解析 逐行進行解析資料 優點 1.逐行解析,不會一次性讀入文件,減少記憶體消耗。2.因為是逐行解析,xml檔案損壞對其沒有影響。缺點 沒辦法獲取檔案的層級關係,對程式設計師而言獲取資料比較麻煩。1.獲取檔案路徑 nsstrin...