解析的基本概念
所謂“解析”:從事先規定好的格式中提取數據。解析的前提:提前約定好格式、數據提供方按照格式提供數據、數據獲取方則按照格式獲取數據,iOS開發常見的解析:XML解析、JSON解析。
JSON數據解析
json:Javascript Object Notation,輕量級的數據交換格式,采用完全獨立于語言的文本格式,被稱為理想的數據交換語言。json中的數據是以數組和字典結合的格式呈現的,數據類型包括:字符串、數值、BOOL、對象、數組。從IOS5開始,APPLE提供了對json的原生支持(NSJSONSerialization)。
//得到文件路徑
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"MovieList" ofType:@"txt"];
//由于解析的時候,需要的是數據類型格式(NSData),所以我們需要把該路徑下得數據轉換為NSData類型
NSData *jsonData = [NSData dataWithContentsOfFile:jsonPath];
//使用Foudtion框架下的解析方法
/**
* Data: 將要解析的數據
* options:解析的一些設置,是枚舉值
NSJSONReadingMutableContainers 解析完成之后返回可變的字典或者數組
NSJSONReadingMutableLeaves 解析完成之后返回值為可變字符串,但是在iOS7的時候偶爾有BUG
NSJSONReadingAllowFragments//蘋果推薦使用的方式,可以解析頂層不是字典或者數組的json串,只要是合理的json串都可以解析。因為系統提供的NSJSONSerialization默認是只能解析頂層為字典或者數組的json串
*/
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
經測試系統提供的json解析速度最快,推薦使用系統的,第三方提供的JSONKit速度接近系統。
xml解析
XML:Extensible Markup language(可擴展標記語言),主流數據格式之一,可以用來存儲和傳輸數據。XML數據結構的語法:聲明;節點使用一對標簽表示,起始和結束標簽。根節點是起始節點,只有一個,節點可以嵌套;節點可以有值。存儲在一對兒標簽中。
##XML的dom解析
- (void)xmlDomParser
{
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"XMLDemo" ofType:@"xml"];
NSData *data =[NSData dataWithContentsOfFile:xmlPath];
NSError *error;
//將XML文件讀取到內存中,并轉為文檔模型,并且是樹狀結構
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
//dom解析時,從根節點開始解析,如果只有一個節點,那么咱們就直接取值,如果次節點還有子節點,那么就一直找尋子節點,直到有值為止。找尋過程肯定是由外而內,也就是從根節點開始,一直往樹狀圖結構的底部查詢
//得到根節點
GDataXMLElement *rootElement = [xmlDocument rootElement];
//再添加一個學生節點,創建一個student節點
GDataXMLElement *creatStudentNode = [GDataXMLNode elementWithName:@"student"];
//為student節點創建子節點name,age,sex
GDataXMLElement *creatNameNode = [GDataXMLNode elementWithName:@"name" stringValue:@"大丁衛"];
GDataXMLElement *creatAgeNode = [GDataXMLNode elementWithName:@"age" stringValue:@"12"];
GDataXMLElement *creatSexNode = [GDataXMLNode elementWithName:@"sex" stringValue:@"未知"];
//為student節點添加剛才創建好的節點
[creatStudentNode addChild:creatNameNode];
[creatStudentNode addChild:creatAgeNode];
[creatStudentNode addChild:creatSexNode];
//為根節點添加剛才創建好的student節點
[rootElement addChild:creatStudentNode];
//得到根節點底部的子節點 由于每個節點的子節點都有可能是多個,所以返回值是數組,所有子節點的獲得都是他們的父節點通過節點名稱(標簽名稱)得到所有的子節點
NSArray *subElement = [rootElement elementsForName:@"student"];
NSLog(@"%@",subElement);
//取出student節點的子節點
for (GDataXMLElement *element in subElement) {
//此處的element是某一個student節點
//取出name節點,它是其中一個student的子節點
NSArray *nameElement = [element elementsForName:@"name"];
NSLog(@"%@",nameElement);
//由于name節點沒有子節點,節點中的值是我們所需要的。并且我們直到nameElement數組中只有一個元素,并且它的類型是GDataElement。但是我們直到該節點中的值的類型為字符串,所以下面需要強制轉換
//取值第一步:取出上面數組中的元素
GDataXMLElement *nameValue = [nameElement objectAtIndex:0];
//強制轉換
NSString *name = [nameValue stringValue];
NSLog(@"%@",name);
NSArray *ageElement =[element elementsForName:@"age"];
GDataXMLElement *ageValue = [ageElement objectAtIndex:0];
NSString *age = [ageValue stringValue];
NSLog(@"%@",age);
}
}