iOS-xml和json數據解析

分類:技術 時間:2016-10-25

1 數據解析

在iOS開發中,常見的數據傳輸格式有兩種:JSON和XML。目前JSON由于其體積小、傳輸速度快等優點,逐漸成為了主流的數據傳輸格式。

2 JSON

在iOS中,JSON的常見解析方法有四種。

第三方框架:

JSONKit、SBJSON、TouchJSON(性能從做往右,越來越差)

蘋果原生:

NSJSONSerialization (性能是最好的,解析推薦使用原生的框架)

下面的表格是JSON的數據格式與OC對象之間的對照表,可以互相轉換。

JSON數據格式 OC對象
{...} NSDictionary
[...] NSArray
12 NSNumber

2.1 JSON轉成OC對象

方法

  • 返回值:OC對象,JSON格式的最外層數據結構對象的OC對象
  • data : 二進制的JSON數據
  • options:選項,任選一個即可。
  • error:錯誤信息

    //類方法
       (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

eg: {quot;successquot;:quot;用戶名密碼正確,成功登陸quot;}

//①序列化json對象
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//②根據字典的屬性,獲取相應的內容
NSString *str = dict[@quot;successquot;];

2.2 OC對象轉換成JSON數據

方法

  • 返回值:返回JSON二進制數據
  • id :OC對象
  • option:只有一個值,隨便寫
  • error :錯誤信息

    //類方法
       (NSData *)dataWithJSONObject:lt;#(nonnull id)#gt; options:lt;#(NSJSONWritingOptions)#gt; error:lt;#(NSError * _Nullable __autoreleasing * _Nullable)#gt;

轉換成的二進制JSON數據可以直接發往服務器

3 XML

XML(可擴展標記語言),是一種數據交互格式。

3.1 文檔格式

一個完整的XML文檔包含:文檔聲明 元素 屬性

#文檔聲明

lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?gt;

#元素

  • 一個語言包含了開始標簽 結束標簽
  • 元素沒有內容也可以
  • 元素能夠嵌套,但不能交叉嵌套
  • 所有的空格和換行都作為內容處理

3.2 解析方式

XML的解析包含兩種方式:SAX方式解析和DOM方式解析

(1)SAX

從根節點開始,挨個裝進內存,適合大文件解析

(2)DOM

整個文檔裝進內存,適合解析小文件

目前針對XML的解析,有相應的解析框架

  • GDataXML:谷歌開發,基于libxml,DOM解析
  • libxml:純C語言,第三方框架,可以SAX、DOM解析
  • NSXMLParser:蘋果原生框架,SAX方式解析

3.3 GDataXML(DOM方式)

解析步驟

(1)

(2)加載xml的二進制數據----GDataXMLDocument

(3)找到根節點----GDataXMLElement

(4)根據子節點名稱找到根節點的子節點 ---- GDataXMLElement

(5)獲取屬性值或者節點的內容 ----attributeWithName 或者 stringValue

添加框架

第一次使用GDataXML需要添加框架以及動態庫,詳見圖片

(1)添加動態庫 libxml

(2)導入鏈接文件

(3)修改ARC

解析舉例

xml文件如下:

lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?gt;
lt;rootgt;
    lt;person id=quot;p1quot;gt;
        lt;namegt;Tomlt;/namegt;
        lt;agegt;24lt;/agegt;
    lt;/persongt;

    lt;person id=quot;p2quot;gt;
        lt;namegt;Lucylt;/namegt;
        lt;agegt;22lt;/agegt;
    lt;/persongt;
lt;/rootgt;

解析代碼

//1 獲取xml文件
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@quot;person.xmlquot; ofType:nil]];

//2 加載xml文件準備解析--內存中
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:(XML_PARSE_NOCDATA | XML_PARSE_NOBLANKS) error:nil];

//3 獲取根節點
GDataXMLElement *root = [document rootElement];

//4 根據根節點 以及子節點的名稱 找到其子節點的數組
NSArray *childArray = [root elementsForName:@quot;personquot;];

//5 遍歷數組
for (GDataXMLElement *person in childArray) {
    //5.1 根據屬性名稱獲取屬性值
    GDataXMLNode *personIDNode = [person attributeForName:@quot;idquot;];
    NSString *personID = [personIDNode stringValue];

    //5.2 根據節點名稱,繼續獲取子節點-name,取數組的第一個值
    GDataXMLElement *nameElement = [person elementsForName:@quot;namequot;][0];
    NSString *name = [nameElement stringValue];

    //5.3 根據節點名稱,繼續獲取子節點-age
    GDataXMLElement *ageElement = [person elementsForName:@quot;agequot;][0];
    NSString *age = [ageElement stringValue];

    //5.4 打印
    NSLog(@quot;name=%@,age=%@quot;,name,age);
}

Tags: JSON XML iOS開發

文章來源:http://www.jianshu.com/p/c2fd2982c248


ads
ads

相關文章
ads

相關文章

ad