【XML簡介】
XML在線校驗工具:
http://tool.oschina.net/codeformat/xml
可擴展標記語言(EXtensible Markup Language)
一種標記語言,很類似 HTML(傳輸、與顯示的區別)
設計宗旨是傳輸數據,而非顯示數據
標簽沒有被預定義
被設計為具有自我描述性
是W3C(萬維網聯盟) 的推薦標准
XML文檔是一種樹結構:
必須包含根元素
所有元素均可擁有子元素
其中的元素形成了一棵文檔樹
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
1 <?xml version="1.0" encoding=“GB2312” standalone=“no” ?>
2 <?xml-stylesheet type=“text/xsl” href=“paixu.xsl” ?>
3 <!--下面是名單列表-->
4 <學生列表>
5 <學生 id = “001”>
6 <學號>200520101</學號>
7 <姓名>王佳</姓名>
8 </學生>
9 <學生 id =“002”>
10 <學號>200520102</學號>
11 <姓名>許琛</姓名>
12 </學生>
13 </學生列表>
XML聲明:第1行
處理命令(可選):第2行
注釋(可選):第3行
XML元素:第4到13行
XML文檔聲明:
每個文檔都必須以XML聲明開頭
包括XML版本(不可省)及所使用字符集等信息
XML文檔前面不允許在有其它任何字符,包括空格
舉例:
<?xml version="1.0" endcoding="GB2312" standalone=“yes"?>
XML元素與標記:
元素是XML文檔的基本單元
標記用來對元素內容進行說明
標記和元素內容共同表示XML文檔的意義和邏輯結構
例:
使用格式: <標記>元素內容</標記>
<mobile>XML解析</mobile>
【解析原理】
XML解析:
將 XML數據從其序列化字符串格式轉換為分層格式的過程
XML解析方式:
基於樹型的解析:將XML文檔轉換成樹型結構
基於事件的解析:將XML文檔視為一系列的事件。當一個特殊事件發生時,解析器將調用開發者提供的函數來處理。
【DOM解析】
英文“Document Object Model”的縮寫,中文意思為“文檔對象模型”
基於樹型解析的XML解析方式
通過樹型結構存取XML文檔
【GDataXML配置-手動配置】
GDataXML基於libxml2庫,得做以下配置
導入libxml2庫
設置libxml2的頭文件搜索路徑(為了能找到libxml2庫的所有頭文件)
在Header Search Path中加入/usr/include/libxml2
設置鏈接參數(自動鏈接libxml2庫)
在Other Linker Flags中加入-lxml2
【GDataXML配置-cocoPods配置】
pod 'GDataXML-HTML', '~> 1.3.0'
【GDataXML-類介紹】
【GDataXML用法】
//獲取文檔
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data encoding:NSUTF8StringEncoding error:nil];
//獲取根元素
GDataXMLElement *rootElement = document.rootElement;
//獲取所有的學生元素
NSArray *array = [rootElement elementsForName:@"stu"];
//遍歷所有元素
for (GDataXMLElement *elent in array) {
//標簽中的屬性
NSString *ID = [elent attributeForName:@"id"].stringValue;
//取出關鍵字對應的所有內容中的第一個元素
GDataXMLElement *elent1 = [elent elementsForName:@"name"].firstObject;
NSString *name = elent1.stringValue;
GDataXMLElement *elent2 = [elent elementsForName:@"sex"].firstObject;
NSString *sex = elent2.stringValue;
}
【XML解析---SAX解析】
1. 創建NSXMLParser實例,並傳入從服務器接收的XML數據
2. 定義解析器代理
3. 解析器解析
4. 通過解析代理方法完成XML數據的解析
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
parser.delegate = self;
[parser parse];
// 1. 開始解析XML文檔
- (void)parserDidStartDocument:
// 2. 開始解析某個元素,會遍歷整個XML,識別元素節點名稱
- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
// 3. 文本節點,得到文本節點里存儲的信息數據,對於大數據可能會接收多次! 為了節約內存開銷
- (void)parser:foundCharacters:
// 4. 結束某個節點,存儲從parser:foundCharacters:方法中獲取到的信息
- (void)parser:didEndElement:namespaceURI:qualifiedName:
注意:在解析過程中,2、3、4三個方法會不停的重復執行,直到遍歷完成為止
// 5. 解析XML文檔結束
- (void)parserDidEndDocument:
// 6. 解析出錯
- (void)parser:parseErrorOccurred:
【JSON簡介】
JSON在線校驗:http://www.bejson.com/
作為一種輕量級的數據交換格式,正在逐步取代XML,成為網絡數據的通用格式
基於JavaScript的一個子集
易讀性略差,編碼手寫難度大,數據量小
JSON格式取代了XML給網絡傳輸帶來了很大的便利,但是卻沒有了XML的一目了然,尤其是JSON數據很長的時候,我們會陷入繁瑣復雜的數據節點查找中
作為一種輕量級的數據交換格式,JSON正在逐步取代XML,成為網絡數據的通用格式
從iOS 5開始,使用NSJSONSerialization對JSON解析
【字符串】
“city”:”北京”
【NSNumber】
“age”: 10
【字典】
{
"weatherinfo": {
"city": "北京",
"cityid": "101010100",
"temp": "10",
"WD": "東南風",
"WS": "2級",
"SD": "26%",
"WSE": "2",
"time": "10:25",
"isRadar": "1",
"Radar": "JC_RADAR_AZ9010_JB",
"njd": "暫無實況",
"qy": "1012"
}
}
【數組】
{
“學生”: [
{
"姓名": "小明",
"年齡": "20"
},
{
"姓名": "小強",
"年齡": "20"
}
]
}
注意:所有的key必須用雙引號闊起來
【JSON解析】
解析的本質,就是將JSON數據轉換為OC數據
其他常見的三種JSON解析第三方庫:
SBJson
JSONKit
TouchJson
從性能上來說,NSJSONSerialization最好,JSONKit其次。SBJson使用較為廣泛,API簡單易用
【NSJSONSerialization】
//將OC對象轉換為JSON Data
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
//將JSON Data轉換為OC對象
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
《了解》
【JSONKit】
NSDictionary *weatherDic = [jsonString objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
【SBJson】
【TouchJson】