XML 和 JSON 解析數據

對於數據的解析方式有兩種: XML 和 JSON 解析
下面來給大家簡單介紹一下這兩種解析方式 , 希望能幫到您!

XML解析方式

//這個系統的解析方式

- (IBAction)xmlParserWithSAX:(UIButton *)sender {
    //SAX解析的方式: 逐行解析, 效率比較低, 資源消耗比較小, 如果xml格式有誤, 錯誤之前的可以解析
    //NSXMLParser, xml解析類(SAX), 繼承於NSObject
    //文件路徑
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
    //url
    NSURL *url = [NSURL fileURLWithPath:fielPath];
    //根據文件路徑創建解析類
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    //整個解析過程, 可以再代理方法中查看
    parser.delegate = self;
    //開始解析
    [parser parse];
    //釋放
    [parser release];    
}

解析過程需要在其代理方法中查看

#pragma mark - NSXMLParserDelegate

//已經開始解析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"文件已經開始解析");
    //對數組初始化
    self.girlArray = [NSMutableArray arrayWithCapacity:3];

}
//文件已經結束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"文件已經結束解析");
    for (Girl *girl in self.girlArray) {
        NSLog(@"%@", girl);
    }
}
//遇到開始標籤
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"遇到開始標籤:%@", elementName);
    //遇到開始標籤girl時創建girl
    if ([elementName isEqualToString:@"girl"]) {
        self.girl = [[Girl alloc] init];
    }

}
//遇到結束標籤
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"遇到結束標籤:%@", elementName);
    if ([elementName isEqualToString:@"name"]) {
        self.girl.name = self.tempString;

    }else if ([elementName isEqualToString:@"age"]){
        self.girl.age = self.tempString;

     }else if ([elementName isEqualToString:@"height"]) {
         self.girl.height = self.tempString;
     }else if ([elementName isEqualToString:@"girl"]){
         [self.girlArray addObject:self.girl];
         [self.girl release];
     }
}
//發現字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"發現字符串:%@", string);
    self.tempString = string;
}
//解析出現錯誤
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"解析出現錯誤:%@", parseError);
}

針對XML還有一些第三方的解析方式

//DOM解析法
//注: 使用第三方類庫, 一定要引入頭文件, 才能使用, 需要該配置環境的要改一下
//如: #import “GDataXMLNode.h”

- (IBAction)xmlParserWithDOM:(UIButton *)sender {
    //DOM解析方式: 正整片讀完, 再解析, 效率比較高, 資源消耗比較大, 如果xml有誤, 就無法解析
    //谷歌提供的DOM解析類, GDataXMLNode

    //第三方類庫的使用
    //1. 下載第三方類, code4app, github
    //2. 導入工程
    //3. 配置環境(可選的)
    //   a. 當前工程是ARC, 第三方類庫是MRC, 需要單獨配置第三方類庫的環境, flag寫成 - fno-objc-arc
    //   b. 當前工程是MRC, 第三方類庫是ARC, 需要單獨配置第三方類庫的環境, flag寫成 - fobjc-arc
    //4. 導入第三方使用的類庫(可選的)
    //   比如GDataXMLNode需要導入libxml
    //5. 配置參數(可選的)
    //6. 引入頭文件

    //文件路徑
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
    //獲取文件內容
    NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
    //解析, 分析出xml文檔的結構
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:nil];

    //獲取根節點 girls
    GDataXMLElement *rootElement = [document rootElement];
    NSLog(@"%@", rootElement);

    //查找girls節點下的子節點girl
    NSArray *girlElements = [rootElement elementsForName:@"girl"];

    //對節點數組進行遍歷
    self.girlArray = [NSMutableArray arrayWithCapacity:3];

    for (GDataXMLElement *element in girlElements) {
//        NSArray *nameElement = [element elementsForName:@"name"];
//        GDataXMLElement *name = [nameElement firstObject];
//        NSLog(@"%@", [name stringValue]);
        NSString *name = [[[element elementsForName:@"name"] firstObject] stringValue];
        NSString *age = [[[element elementsForName:@"age"] firstObject] stringValue];
        NSString *height = [[[element elementsForName:@"height"] firstObject] stringValue];
        //NSLog(@"%@ %@ %@", name, age, height);

        Girl *girl = [[Girl alloc] init];
        girl.name = name;
        girl.age = age;
        girl.height = height;
        [self.girlArray addObject:girl];
        [girl release];
    }
    for (Girl *girl in self.girlArray) {
        NSLog(@"%@", girl);
    }

    //GDataXMLNode是支持XPath的
    //XPath: 路徑檢索

    // /代表絕對路徑, //代表相對路徑
    NSArray *elements = [rootElement nodesForXPath:@"girl/name" error:nil];

    for (GDataXMLElement *element in elements) {
        NSLog(@"%@", [element stringValue]);
    }

}

//下面來說一下JSON解析

//系統JSON的解析方法

- (IBAction)JSONparserWithSyetem:(UIButton *)sender {
//    NSJSONSerialization, json解析類, 繼承與NSObject

    //文件路徑
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];

    //從指定文件獲取二進制數據
    NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];

    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    //NSLog(@"%@", array);
    NSMutableArray *boyArray = [NSMutableArray arrayWithCapacity:0];
    for (NSDictionary *dic in array) {
        //1.
//        Boy *boy = [[Boy alloc] init];
//        boy.name = dic[@"name"];
//        boy.age = dic[@"age"];
//        boy.height = dic[@"height"];
//        [boyArray addObject:boy];
//        [boy release];
        //2.KVC賦值
//        Boy *boy = [[Boy alloc] init];
//        [boy setValuesForKeysWithDictionary:dic];
//        [boyArray addObject:boy];
//        [boy release];
        //
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        [boyArray addObject:boy];
        [boy release];

    }

    for (Boy *boy in boyArray) {
        NSLog(@"%@", boy);
    }


}

第三方的JSON解析方法
//注: 使用第三方類庫, 一定要引入頭文件, 才能使用, 需要該配置環境的要改一下
//如: #import “JSONKit.h”

- (IBAction)jsonparserWithThirdPart:(UIButton *)sender {
    //JOSNKit
    //1.
    //從指定文件獲取字符串
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];

    //從指定文件獲取內容
    NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
    //使用JOSNKit解析json字符串
    NSArray *array = [content objectFromJSONString];
    //NSLog(@"%@", array);

    for (NSDictionary *dic in array) {
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        NSLog(@"%@", boy);
    }
    [content release];
    //2
    //從指定文件獲取二進制數據
    NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];
    NSLog(@"---------第二種解析方法----------");
    //使用JSONKit解析json二進制數據
    NSArray *array1 = [data objectFromJSONData];
    for (NSDictionary *dic in array1) {
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        NSLog(@"%@", boy);
    }
    [data release];

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章