@GDataXMLNode是Google提供的用于XML數據處理的類集。該類集對libxml2-DOM處理方式進行了封裝,能對較小或中等的XML文檔進行讀寫操作且支持XPath語法。
? ? 1.[http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/](http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/),獲得GDataXMLNode.h和GDataXMLNode.m文件,進行如下操作將文件導入到Xcode的工程中:
??? 2.將GDataXMLNode.h/m文件添加到工程中;
??? 3.向工程中增加“libxml2.dylib”庫;
??? 4.在工程的“Build Settings”頁中找到“Header Search Path”項,添加“/usr/include/libxml2”到其路徑

? ??5.搜索框中搜索Other linker flags,同樣的方式添加-lxml2

**@代碼示例:**
? ? ? 首先在工程中新建一個xml文件,作為我們要解析的對象,新建方法是在工程中新建一個Empty的文件,命名為Student.txt(可以命名為.xml,這個隨意),然后添加內容:
~~~
<?xml version="1.0" encoding="UTF-8"?>
<Students class="17班" school="中國">
<student>
<number>1</number>
<name>胡明濤</name>
<sex>男</sex>
<phone>123558</phone>
</student>
<student>
<number>2</number>
<name>成風采</name>
<sex>男</sex>
<phone>122323</phone>
</student>
<student>
<number>3</number>
<name>陳咬金</name>
<sex>男</sex>
<phone>21313558</phone>
</student>
<student sign="非應屆生">
<number>4</number>
<name>天天下</name>
<sex>男</sex>
<phone>56453558</phone>
</student>
</Students>
~~~
~~~
#pragma mark - GDataXMLNode
- (void)onClickGDataXMLButton{
// 獲取工程目錄的xml文件
NSData * xmlData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Student" ofType:@"txt"]];
// 從文檔中讀出完整的XML數據,在內存中形成完整的樹形結構
NSError * error = nil;
GDataXMLDocument * documents = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:&error];
// 取得根節點(element元素)---Students
GDataXMLElement * rootEL = [documents rootElement];
// 獲取根節點下的節點,返回的數組---student
NSArray * studentsArray = [rootEL elementsForName:@"student"];
for (int i = 0; i < [studentsArray count]; i++) {
// 獲取單個節點對象
GDataXMLElement * student = [studentsArray objectAtIndex:i];
// 獲取student節點下name,number,sex,phone節點的值
GDataXMLElement * nameElement = [[student elementsForName:@"name"] lastObject];
GDataXMLElement * sexElement = [[student elementsForName:@"sex"]lastObject];
GDataXMLElement * numberElement = [[student elementsForName:@"number"]lastObject];
GDataXMLElement * phoneElement = [[student elementsForName:@"phone"]lastObject];
NSString * name = [nameElement stringValue];
NSString * number = [numberElement stringValue];
NSString * sex = [sexElement stringValue];
NSString * phone = [phoneElement stringValue];
// 讀標簽里面的屬性(attributeForName)
NSString * sign = [[student attributeForName:@"sign"]stringValue];
if (sign) {
NSLog(@"----------%@",sign);
}
NSLog(@"%@,%@,%@,%@",number,name,sex,phone);
}
#pragma mark 通過路徑,取得指定的節點值,所有節點中同一標簽的值
// 一個是相對路徑,一個是絕對路徑-----------(nodesForXPath)
//NSArray * nameArray = [rootEL nodesForXPath:@"//name" error:nil];
NSArray * nameArray = [rootEL nodesForXPath:@"student/name" error:nil];
for (int i = 0; i < [nameArray count]; i++) {
NSString * name = [[nameArray objectAtIndex:i] stringValue];
NSLog(@"---%@",name);
}
}
~~~
~~~
<?xml version="1.0"?>
<xml_api_reply version="1">
<cities>
<city>
<name data="保定"/>
<latitude_e6> 38849998</latitude_e6>
<longitude_e6> 115569999</longitude_e6>
</city>
<city default="true" >
<name data="北京"/>
<latitude_e6> 39930000</latitude_e6>
<longitude_e6> 116279998</longitude_e6>
</city>
<city>
<name data="沈陽"/>
<latitude_e6> 41770000</latitude_e6>
<longitude_e6> 123430000</longitude_e6>
</city>
<city>
<name data="成都"/>
<latitude_e6> 30670000</latitude_e6>
<longitude_e6> 104019996</longitude_e6>
</city>
<city>
<name data="大連"/>
<latitude_e6> 38900001</latitude_e6>
<longitude_e6> 121629997</longitude_e6>
</city>
<city>
<name data="福州"/>
<latitude_e6> 26079999</latitude_e6>
<longitude_e6> 119279998</longitude_e6>
</city>
<city>
<name data="阜陽"/>
<latitude_e6> 32930000</latitude_e6>
<longitude_e6> 115830001</longitude_e6>
</city>
<city>
<name data="贛州"/>
<latitude_e6> 25850000</latitude_e6>
<longitude_e6> 114949997</longitude_e6>
</city>
<city>
<name data="廣州"/>
<latitude_e6> 23129999</latitude_e6>
<longitude_e6> 113319999</longitude_e6>
</city>
<city>
<name data="貴陽"/>
<latitude_e6> 26579999</latitude_e6>
<longitude_e6> 106720001</longitude_e6>
</city>
<city>
<name data="哈爾濱"/>
<latitude_e6> 45750000</latitude_e6>
<longitude_e6> 126769996</longitude_e6>
</city>
<city>
<name data="海口"/>
<latitude_e6> 20030000</latitude_e6>
<longitude_e6> 110349998</longitude_e6>
</city>
<city>
<name data="邯鄲"/>
<latitude_e6> 38029998</latitude_e6>
<longitude_e6> 114419998</longitude_e6>
</city>
<city>
<name data="杭州"/>
<latitude_e6> 30229999</latitude_e6>
<longitude_e6> 120169998</longitude_e6>
</city>
<city>
<name data="合肥"/>
<latitude_e6> 31870000</latitude_e6>
<longitude_e6> 117230003</longitude_e6>
</city>
<city>
<name data="菏澤"/>
<latitude_e6> 36119998</latitude_e6>
<longitude_e6> 114370002</longitude_e6>
</city>
<city>
<name data="衡陽"/>
<latitude_e6> 36119998</latitude_e6>
<longitude_e6> 114370002</longitude_e6>
</city>
</cities>
</xml_api_reply>
~~~
~~~
#pragma mark - 解析citys
- (void)parseCitys{
NSData * xmlCitysData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"]];
// 從文檔中讀取完成的XML文檔,在內存中形成完整的樹形結構
NSError * error = nil;
GDataXMLDocument * documents = [[GDataXMLDocument alloc]initWithData:xmlCitysData options:0 error:&error];
// 取得根節點
GDataXMLElement * rootNode = [documents rootElement];
#pragma mark 獲取根節點xml_api_reply的數組,包含的是cities
NSArray * citiesArray = [rootNode elementsForName:@"cities"];
for (int i = 0; i < [citiesArray count]; i++) {
// 取得單個cities節點
GDataXMLElement * cities = [citiesArray objectAtIndex:i];
#pragma mark 獲取節點cities的數組,包含的是city
NSArray * cityArray = [cities elementsForName:@"city"];
for (int j = 0; j < [cityArray count]; j++) {
// 取得單個city節點
GDataXMLElement * city = [cityArray objectAtIndex:j];
#pragma mark city節點下面是3個并行的節點,都是1個,直接通過lastObject來取得想要的值
NSString * name = [[[[city elementsForName:@"name"]lastObject] attributeForName:@"data"] stringValue];
NSLog(@"name = %@",name);
NSString * latitude_e6 = [[[city elementsForName:@"latitude_e6"]lastObject] stringValue];
NSLog(@"latitude_e6 = %@",latitude_e6);
NSString * longitude_e6 = [[[city elementsForName:@"longitude_e6"]lastObject] stringValue];
NSLog(@"longitude_e6 = %@",longitude_e6);
}
}
}
~~~
@GDataXMLNode方法小結:
? ? ?最終的數據讀出都是在GDataXMLElement對象中讀出的,以下方法均為GDataXMLElement類的方法
? ? ?1、elementsForName方法,取標簽名 ?name標簽的名稱“name”
? ? ?2、attributeForName: 取屬性結點 再調stringValue即可取到屬性值?
? ? ?3、stringValue: 取標簽間的字符串值
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking