解析 xml 通常有兩種方式,dom 和 sax:
xml的資料格式:
第一種: 屬性在字典「data」中儲存
第二種: 屬性在兩個尖括號中間
1
王百惠女
110
xml解析之sax解析:
sax解析是通過nsxmlparser解析的解析方式。nsxmlparser採用了委託設計模式,因此他的實現類需要採用協議並支援委託。nsxmlparser解析xml需要遵循nsxmlparserdelegate協議。
簡單地說,sax解析就是從頭到尾的逐行讀取文件,通過協議判斷讀取到值時採取操作,順序是先讀取頭標籤在讀取結束標籤。這樣就可以取到標籤所對應的值了。下面我們來看一下實現這樣功能的主要**:
-(void)startparser
準備工作,將xml檔案匯入工程,在開始解析之前,我們要先獲取它的位址,並初始化乙個,要遵循協議,我們就是通過這個協議中的方法,來解析資料以獲取xml中的值。
//獲取內容
- (void)parser:(nsxmlparser *)parser foundcharacters:(nsstring *)string
//標籤名
static nsstring * kstudent = @"student";
static nsstring * knumber = @"number";
//協議 開始解析
- (void)parser:(nsxmlparser *)parser didstartelement:(nsstring *)elementname
namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring *)qname attributes:
(nsdictionary *)attributedict
}//協議 解析結束 賦值
- (void)parser:(nsxmlparser *)parser didendelement:(nsstring *)elementname
namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring *)qnameif ([elementname isequaltostring:kname]) if ([elementname isequaltostring:kstudents])
}
這三個是nsxmlparserdelegate的內容,也是我們用來解析的最關鍵的3個協議,分別對應xml中的乙個屬性和兩個element。當xml的格式為前面所說的第一種時,我們取值也可以省略幾步,直接在- (void)parser:(nsxmlparser *)parser didstartelement:(nsstring *)elementname namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring
*)qname attributes:(nsdictionary *)attributedict{}這個協議中獲取 ,因為你要的資訊就再第乙個標籤內,最後只要判斷最後乙個資料的節點名就可以了。標籤是為了方便,避免element的名字混淆。
而當乙個資料的屬性過多時,而且在另外的類中使用,對我們傳值來說就困難了,所以我們一般會將乙個資料的各種屬性寫成乙個model,再將所有的model加到乙個陣列中,通過陣列儲存。
若是要傳值(controller之間),在sax解析中 ,我們是通過自己寫協議來實現的。如下:
#import @protocol saxxmlparserdelegate;
@inte***ce saxxmlparser : nsobject@property(nonatomic,assign) id delegate;
@end
@protocol saxxmlparserdelegate -(void)sendmessagetorootwitharr:(nsarray *)array;
@end
xml解析之dom解析:
下面我們來看看dom解析是如何的乙個過程吧。
-(void)domparser
//獲得節點名
gdataxmlelement * root = [document rootelement];
//根據子節點 獲得子節點陣列
nsarray * arr = [root elementsforname:@"student"];
//獲得根節點
nsstring * str = [root name];
nslog(@"%@",str);
for (gdataxmlelement * element in arr)
}}
這裡我們引用了gdataxmlnode第三方類。
同樣,通過位址找到document,再獲得根節點,根據資料的結構,一次層級的取得下一級的節點,一直取到一整個model的屬性的節點時,將這幾個節點的內容放到model裡面(通過遍歷的方法),最後的乙個或者若干個陣列(本例中只有乙個陣列),裡面包含了乙個個的model,而這些,就是我們解析出來的資料。要注意管理迴圈內的記憶體管理,model在**要初始化,在**不用,請參考上例。以上是我對於xml解析的一點理解,希望能夠幫到大家。以後會陸續更新。。。
iOS之資料解析之XML解析
xml解析常見的兩種方式 dom解析和sax解析 dom解析 解析 如下 void xmldommethed nslog self sourcearray 寫入 如下 通過dom解析方式為xml增加節點 sax只可以讀取,不可以新增 void domaddnote sax解析 遵循協議 inte c...
iOS 網路資料之XML解析
向伺服器請求資料,那麼資料必須以某個特定的格式存放,然後一方把資料按這種格式組織起來,另一方按相同的方式把資料解析數來,就像是我們人之間講話交流,我們的話會轉變成振動 在空氣中傳播 然後對方的耳朵感受這種振動,然後把振動轉化為話,所以我認為格式的組織是為了更好的傳遞資料。一般網路資料會封裝成兩種格式...
iOS學習筆記 xml資料解析
在iphone開發中,xml的解析有很多選擇,ios sdk提供了nsxmlparser和libxml2兩個類庫,另外還有很多第三方類庫可選,例如tbxml touchxml kissxml tinyxml和gdataxml。這篇文章使用了nsxmlparser。解析 xml 通常有兩種方式,dom...