天天看點

UI第十五天:XML、JSON資料結構解析

⼀、解析的基本概念 所謂“解析”:從事先規定好的格式中提取資料 解析的前提:提前約定好格式、資料提供⽅按照格式提供資料、 資料擷取⽅則按照格式擷取資料 iOS開發常⻅的解析:XML解析、JSON解析

⼆、XML資料結構 XML:Extensible Markup language(可擴充标記語⾔),主流數 據格式之⼀,可以⽤來存儲和傳輸資料。

資料交換 内容管理 ⽤作配置⽂件

聲明 節點使⽤⼀對标簽表⽰。起始和結束标簽。 根節點是起始節點,隻有⼀個。節點可以嵌套。 節點可以有值。存儲在⼀對⼉标簽中。

三、JSON資料結構 Javascript Object Notation,輕量級的資料交換格式,采⽤完全 獨⽴于語⾔的⽂本格式,被稱為理想的資料交換語⾔ JSON⽂檔有兩種結構:對象、資料 對象:以“{”開始,以“}”結束,是“名稱/值”對⼉的集合。名稱和值中 間⽤“:”隔開。多個“名稱/值”對之間⽤“ , ”隔開。類似OC中的字典。 數組:以“[”開始,以“]”結束,中間是資料。資料以“ , ”分隔。 JSON中的資料類型:字元串、數值、BOOL、對象、數組。

四、XML與JSON兩種資料結構的優缺點 //解析xml資料(SAX解析)

-(void)xmlParserUpData

{

    //利用系統的NSXMLParser

    //xml分析 人 類

    //以驅動事件循環進行xml的解析(利用觸發的代理方法進行解析)

    //真谛:逐行解析

    //建立分析人

    //擷取xml檔案路徑

    NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:[NSData dataWithContentsOfFile:path]];

    //驅動事件(設定代理)

    parser.delegate = self;

    //開始分析

    [parser parse];

    //釋放

    [parser release];

}

#pragma mark -- 代理方法

-(void)parserDidStartDocument:(NSXMLParser *)parser

{

    //初始化數組儲存model

    self.arr = [NSMutableArray array];

    NSLog(@"已經開始分析檔案");

}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    //遇到student節點初始化model

    if ([elementName isEqualToString:@"Student"]) {

        self.model = [[Student alloc]init];

    }

}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

    //儲存字元串

    self.str = string;

}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if ([elementName isEqualToString:@"Student"]) {

        [self.arr addObject:self.model];

        [self.model release];

    }else

    {

        [self.model setValue:self.str forKey:elementName];

    }

}

-(void)parserDidEndDocument:(NSXMLParser *)parser

{

    NSLog(@"已經結束檔案分析"); }

// Dom 解析 依靠第三方類庫 GDataXMLNode

// GDataXMLNode 類 依靠系統的 libxml2 來實作 // 使用的時候 需要導入 libxml2 架構     設定Header Search paths      /usr/include/libxml2  // 真谛 : 把所有的節點一次性讀取 并轉化為 樹形結構 整體解析 ( 與 SAX 解析對比 )

//-(void)GDataXMLNodeUpData

//{

//    NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];

//    // 建立一個空的錯誤對象

//    NSError *error = nil;

//   

//

//    // 初始化檔案對象

//    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:[NSData dataWithContentsOfFile:path] options:0 error:&error]; //    // 擷取根節點       //逐層剝去不能跳步

//    GDataXMLElement *rootelement = doc.rootElement;

//    // 擷取根節點下 student

//    NSArray *arr = [rootelement elementsForName:@"Student"];

//    self.dataArray = [NSMutableArray array];

//    // 周遊數組 對每一個 Student 節點 繼續化整為零

//    for (GDataXMLElement *element in arr) {

//       NSString *name =[self test:element elementname:@"name"];

//       NSString *gender =  [self test:element elementname:@"gender"];

//       NSString *age =  [self test:element elementname:@"sex"];

//       NSString *motto =  [self test:element elementname:@"motto"];

//        Student *model = [[Student alloc]init];

//        model.name = name;

//        model.gender =gender;

//        model.age= age;

//        model.motto =motto;

//        [self.dataArray addObject:model];

//        [model release];

//    }

//}

// 1. 找爆紅的對象 ( 是方法沒有的 需要外界傳進來 )

// 2. 找可變的對象 ( 例如 name 也是需要傳遞的 ) // 選好傳回值

/ 解析 json 資料

// 真谛 : 必須要指定 json 檔案的最外層是什麼 // [] 數組 {} 字典 //JSONKIT 解析資料

    NSString *path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"json"];

    NSData *data = [NSData dataWithContentsOfFile:path];

    //jsonKit 解析

    NSMutableArray *arr = [data objectFromJSONData];      self.arr = [NSMutableArray array];     //json 解析 //    NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutableContainers error:nil];

    for (NSDictionary *one in arr) {

        City *model = [[City alloc]init];

        [model setValuesForKeysWithDictionary:one];

        [self.arr addObject:model];

        [model release];

    }

五、進⾏XML資料結構解析時使⽤到的SAX⼯具,DOM⼯具 SAX:Simple API for XML。基于事件驅動的解析⽅式,逐⾏解析 資料。(采⽤協定回調機制) NSXMLParser是iOS⾃帶的XML解析類。采⽤SAX⽅式解析資料。 解析過程由NSXMLParserDelegate協定⽅法回調 解析過程:開始标簽->取值->結束标簽->取值

DOM:Document Object Model(⽂檔對象模型)。解析時需要 将XML⽂件整體讀⼊,并且将XML結構化成樹狀,使⽤時再通過樹 狀結構讀取相關資料

GDataXMLNode是Google提供的開源XML解析類,對 libxml2.dylib進⾏了Objective-C的封裝 采⽤DOM⽅式解析資料 iOS中包含⼀個C語⾔的動态連結庫libxml2.dylib,解析速度⽐ NSXMLParser快

六、進⾏JSON資料結構解析時使⽤到的第三⽅架構 NSJSONSerialization對象的作⽤ JSONDecoder對象的作⽤ NSString(JSONKitDeserializing)類⺫的作⽤ NSData(JSONKitDeserializing)類⺫的作⽤ NSString(JSONKitSerializing)類⺫的作⽤ NSArray(JSONKitSerializing)類⺫的作⽤ NSDictionary(JSONKitSerializing)類⺫的作⽤

總結

資料解析:從某種格式的資料中提取⾃⼰所需要的資料。 主流的資料交換格式有兩種:XML和JSON XML解析分為兩種:SAX解析和DOM解析 XML解析⼯具:NSXMLParser、GDataXMLNode、TochXML和KissXML等 JSON解析⼯具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON 等,其中NSJSONSerialization是系統提供的解析類,其解析效率是最⾼的

繼續閱讀