iOS進階學習-網路之資料解析,ios進階資料解析
一、解析的基本概念
- 所謂“解析”:從事先規定好的格式中提取資料。
- 解析的前提:提前約定好格式,資料提供方按照格式提供資料、資料擷取方則按照格式擷取資料。
- iOS開發常見的解析:XML解析、JSON解析。
二、XML資料結構
- XML:Extensible Markup language(可延伸標記語言 (XML)),主流資料格式之一,可以用來儲存和傳輸資料。
- XML資料格式的功能:資料交換,內容管理,用作設定檔。
- XML資料結構的文法:1)聲明;2)節點使用一堆標籤表示;3)根節點是起始節點,只有一個,節點可以嵌套4)節點可以有值,儲存在一對兒標籤中。
三、進行XML資料結構解析時使用到的SAX工具,DOM工具
1、SAX工具:
- SAX解析:SAX(Simple API for XML),基於時間驅動的解析方式,逐行解析資料。(採用協議回調機制)。
- NSXMLParser是iOS內建的XML解析類,採用SAX方式解析資料。
- 解析過程由NSXMLParserDelegate協議方法回調。
- 解析過程:開始標籤->取值->結束標籤->取值
- 初始化NSXMLParser:
#pragma mark - sax解析XML檔案- (IBAction)saxParserActionXMLDocument:(UIButton *)sender { // 1.擷取檔案路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentsInfo_XML" ofType:@"txt"]; // 2.擷取出NSData類型的資料 NSData *data = [NSData dataWithContentsOfFile:path];// 3.設定SAX解析,並關聯相關的xml檔案 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 4.設定代理 parser.delegate = self; // 5.開始解析 [parser parse];}
- NSXMLParserDelegate的協議方法:
#pragma mark - NSXMLParserDelegate的協議方法// 1.文檔解析(報告解析的開始)- (void)parserDidStartDocument:(NSXMLParser *)parser{ // 初始化儲存資料的數組 self.dataArray = [[NSMutableArray alloc] init];}// 2.發現標籤開始的處理函數(即報告元素的開始以及元素的屬性)- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { // 根據需求需要的標籤去擷取相關的資料 if ([elementName isEqualToString:@"student"]) { Student *stu = [[Student alloc] init]; // 將資料對象添加到數組中 [self.dataArray addObject:stu]; } // 將當前的標籤值傳給記錄標籤的屬性 self.currentElement = elementName;}// 3.解析標籤中的內容,然後賦值給對象- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ // 從數組中取出相關的student對象,每次從數組中取最後一個元素,保證每次取出最新的對象內容 Student *stu = [self.dataArray lastObject]; // KVC賦值 [stu setValue:string forKey:self.currentElement]; }// 4.結束標籤- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { self.currentElement = nil;}// 5.結束文檔解析(報告解析的結束)- (void)parserDidEndDocument:(NSXMLParser *)parser { for (Student *stu in self.dataArray) { NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby); }}// 6.錯誤處理- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"error = %@", parseError);}
2、DOM工具
- DOM解析:DOM(Document Object Model)DOM方式解析XML時,讀入整個XML文檔並構建一個駐留記憶體的樹結構(節點數),通過遍曆樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以藉助XPath,直接查詢XML節點。
- GDataXMLNode:採用DOM方式解析資料;iOS中包含一個C語言的動態連結程式庫libxml2.dylib(xcode7以後改為libxml2.tab),解析速度比NSXMLParser快;GDataXMLNode是Google提供的開源XML解析類,對libxml2.tab進行了Objective-C的封裝,能對較小或中等的xml文檔進行讀寫操作且支援Path文法。
- GDataXMLNode使用方法:
- 擷取GDataXMLNode.h/m檔案,將GDataXMLNode.h/m檔案添加到工程中。
- 向工程中增加“libxml2.tab”動態庫。
- 這時編譯會報錯:
- 原因如下:
- 具體操作:
- 在工程的“Build Settings”頁中找到“Header Search Path”項,添加“/usr/include/libxml2”,找到“Other Linker Flags”項,添加“-lxml2”。
- 這時編譯如果工程報如下錯誤:
- 此錯誤為非ARC檔案無法在ARC工程下啟動並執行錯誤,解決辦法:找到相應工程檔案,添加-fno-objc-arc,反之添加-fobjc-arc。圖示:
- 匯入“GDataXMLNode.h”檔案到標頭檔中,如工程能編譯通過,則說明GDataXMLNode添加成功。
- 程式碼範例:
#pragma mark - dom解析XML檔案- (IBAction)domParserActionXMLDocument:(id)sender { // 首先引入動態庫 // 1.擷取檔案的路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentsInfo_XML" ofType:@"txt"]; // 2.擷取出NSData類型的資料 NSData *data = [NSData dataWithContentsOfFile:path]; // 初始化儲存資料的數組 self.dataArray = [[NSMutableArray alloc] init]; // 3.設定DOM解析(建立解析文檔) GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 4.擷取根節點 GDataXMLElement *rootElement = document.rootElement; // 5.遍曆擷取相對應的子節點 for (GDataXMLElement *studentElement in rootElement.children) { Student *stu = [[Student alloc] init]; // 遍曆擷取子節點的子節點 for (GDataXMLElement *stuElement in studentElement.children) { NSLog(@"stuElement = %@", stuElement); // 根據標籤給student對象賦值 // stuElement.name 標籤的名字 // stuElement.stringValue 標籤的值 [stu setValue:stuElement.stringValue forKey:stuElement.name]; } [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby); }}
四、JSON資料結構
1、JSON資料結構的概念:JSON(JavaScript Object Notation)是一種輕量級的資料交換格式。JSON採用完全獨立於語言的文字格式設定,易於閱讀和編寫,同時也易於機器解析和產生。這些特性使JSON成為理想的資料交換語言。
2、JSON檔案有兩種結構:
- 對象:“名稱/值”對的集合。不同的語言中,它被理解為對象,記錄,結構,字典,雜湊表,有鍵列表,或者關聯陣列。以“{”開始,以“}”結束,是“名稱/值”對的集合。名稱和值中間用“:”隔開。多個“名稱/值”對之間用“,”隔開。
- 數組:值得有序列表。在大部分語言中,它被理解為數組。以“[”開始,以“]”結束,中間是資料以“,”分隔。
- JSON中的資料類型:字串、數值、BOOL、對象、數組。
- JSON資料結構的功能:資料交換,內容管理,設定檔。
- JSON資料樣本:
五、進行JSON資料結構解析時使用到的第三方架構以及系統方法
1、系統方法解析JSON資料:
#pragma mark - 系統內建的JSON資料解析- (IBAction)foundationParserActionJSONDocument:(id)sender { // 1.擷取檔案的路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"]; // 2.擷取出NSData類型的資料 NSData *data = [NSData dataWithContentsOfFile:path]; // 初始化儲存資料的數組 self.dataArray = [[NSMutableArray alloc] init]; // 3.解析資料 NSArray *resultArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; // 4.遍曆數組,使用KVC給對象賦值 for (NSDictionary *dict in resultArray) { Student *stu = [[Student alloc] init]; [stu setValuesForKeysWithDictionary:dict]; [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby); } }
2、使用JSONKit解析json資料:先引入第三方架構JSONKit.h/m檔案,按照上面的步驟將非ARC檔案在ARC工程下使用。
#pragma mark - 使用JSONKit解析json資料- (IBAction)jsonKitParserActionJSONDocument:(id)sender { // 1.擷取檔案的路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_json" ofType:@"txt"]; // 2.擷取出NSData類型的資料 NSData *data = [NSData dataWithContentsOfFile:path]; // 初始化儲存資料的數組 self.dataArray = [[NSMutableArray alloc] init]; // 3.解析資料 NSArray *resultArray = [data objectFromJSONData]; // 4.遍曆數組,取出其中的字典,然後使用KVC給對象賦值 for (NSDictionary *dict in resultArray) { Student *stu = [[Student alloc] init]; [stu setValuesForKeysWithDictionary:dict]; [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", stu.name, stu.gender, stu.age, stu.hobby); }}
六、XML與JSON兩種資料結構的優缺點
1、XML優缺點:
- 優點:
- 格式統一,符合標準。
- 容易與其他系統進行遠程互動,資料共用比較方便。
- 缺點:
- XML檔案格式檔案龐大,格式複雜,傳輸佔用頻寬。
- 伺服器端和用戶端都需要花費大量代碼來解析XML,不論伺服器端還是用戶端都使代碼變得異常複雜和不容易維護。
- 用戶端不同瀏覽器之間解析XML的方式不一致,需要重複編寫很多代碼。
- 伺服器端和用戶端解析XML花費資源和時間。
2、JSON優缺點:
- 優點:
- 資料格式比較簡單,易於讀寫,格式都是壓縮的,佔用頻寬小。
- 易於解析這種語言。
- 支援多種語言,包括ActionScript,C,C#,ColdFusion,JAVA,JAVAScript,Perl,PHP,Python,Ruby等語言伺服器端語言,便於伺服器端的解析。
- 因為JSON格式能夠直接為伺服器端代碼使用,大大 簡化了伺服器端和用戶端的代碼開發量,但是完成的任務不變,且易於維護。
- 缺點:
- 沒有XML格式推廣的深入人心和使用廣泛,通用性不如XML。
- JSON格式目前在Web Service中推廣還屬於初級階段。