iOS進階學習-網路之資料解析,ios進階資料解析

來源:互聯網
上載者:User

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中推廣還屬於初級階段。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.