IOS XML的類型數據的解析


在iPhone開發中,XML的解析有很多選擇,iOS SDK提供了NSXMLParser和libxml2兩個類庫,另外還有很多第三方類庫可選,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。問題是應該選擇哪一個呢?

解析 XML 通常有兩種方式,DOM 和 SAX:

  • DOM解析XML時,讀入整個XML文檔並構建一個駐留內存的樹結構(節點樹),通過遍歷樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以借助XPath,直接查詢XML節點。
  • SAX解析XML,是基於事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔加載完之后才采取操作,當在讀取解析過程中遇到需要處理的對象,會發出通知對其進行處理。

一般在iOS平台下,比較常用的XML解析類庫有如下幾種:

安裝說明
GDataXML

1. 從http://code.google.com/p/gdata-objectivec-client/downloads/list下載“gdata-objective-c client library.”

2. 解壓縮文件,找到Source\XMLSupport,並且將其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到項目中

3. 選中項目,選中“Build Settings”標簽頁

4. 將Build Settings頁中,頂部的“Basic”標簽切換到“All”

5. 找到“Paths\Header Search Paths”項,並添加“/usr/include/libxml2”到列表中

6. 找到“Linking\Other Linker Flags”項,並添加“-lxml2”到列表中

clip_image002

 

在需要調用GDataXML的代碼文件頭部,加入:

#import “GDataXMLNode.h”

TouchXML

1. 從https://github.com/TouchCode/TouchXML下載最新TouchXML源碼

2. 解壓后,將其中的Sources目錄下的文件和目錄都拖到項目中

3. 選中項目,選中“Build Settings”標簽頁

4. 將Build Settings頁中,頂部的“Basic”標簽切換到“All”

5. 找到“Paths\Header Search Paths”項,並添加“/usr/include/libxml2”到列表中

6. 找到“Linking\Other Linker Flags”項,並添加“-lxml2”到列表中

在需要調用TouchXML的代碼文件頭部,加入:

#import “TouchXML.h”

TBXML

1. 從http://www.tbxml.co.uk/TBXML/TBXML_Free.html下載最新TBXML源碼

2. 解壓后,將其中的TBXML.h, TBXML.m, NSDataAdditions.h和NSDataAddtions.m四個文件拖到項目中

3. 添加對libz.dylib類庫的應用

在需要調用TBXML的代碼文件頭部,加入:

#import “TBXML.h”

使用說明
GDataXML

讀取XML文件,並解析成為DOM文檔對象示例:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];

NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];

NSError *error;

GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];

if (doc == nil) { return nil; }

NSLog(@"%@", doc.rootElement);

[doc release];

[xmlData release];

轉載:http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html

下面專門介紹谷歌的GdataXml,GdataXml是專門的谷歌解析XML的解析類。就是之前的設置復雜點。

GDataXml 相同標簽的多個屬性,好多文檔都沒有介紹獲取屬性的方法,讓我找的好苦啊,必須分享!!!
首先向Frameworks文件中添加libxml2.dylib這個庫,而后再Croups & Files 側邊欄中雙擊我們的工程圖標,找到 build 修改兩個屬性如下:
在Search Paths中 找到Header Search Paths 將其對應的值修改為:/usr/includebxml2
在Linking中找到 Other Linker Flags 對應的值改為:-lxml2
GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithXMLString:resp*****eBody opti*****:2 error:nil];
if (doc!=nil) {
GDataXMLElement *root=[doc rootElement ];
NSLog(@"--------root's children:--------\n%@", root);
//取出根節點的所有孩子節點
//取出某一個具體節點(body節點)
[returnInfo setObject:[[[root elementsForName:@"db:uid"] objectAtIndex:0] stringValue] forKey:@"snsUserUid"];
[returnInfo setObject:[[[root elementsForName:@"title"]objectAtIndex:0]stringValue] forKey:@"snsNickName"];
[returnInfo setObject:[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue] forKey:@"snsProvince"];
[returnInfo setObject:[[[[root elementsForName:@"link"] objectAtIndex:2]attributeForName:@"href"] stringValue] forKey:@"snsProfileImageUrl"];
[returnInfo setObject:@"4" forKey:@"snsLandEntrance"];
NSLog(@"%@",[[[root elementsForName:@"link"] objectAtIndex:2]attributes]);
NSLog(@"%@",[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue]);
}
NSLog(@"returnInforeturnInforeturnInforeturnInforeturnInfo%@",returnInfo);

谷歌的GdataXML支持Xpath語法查詢

<?xml version="1.0" encoding="ISO-8859-1"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd country="UK"> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog>

 

定位節點
XML是樹狀結構,類似檔案系統內資料夾的結構,XPath也類似檔案系統的路徑命名方式。不過XPath 是一種模式(Pattern),可以選出 XML檔案中,路徑符合某個模式的所有節點出來。例如要選catalog底下的cd中所有price元素可以用:
/catalog/cd/price   

 
如果XPath的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。以下的語法會選出文件中所有叫做cd的元素(在樹中的任何層級都會被選出來):
//cd

 
選擇未知的元素
使用星號(Wildcards,*)可以選擇未知的元素。下面這個語法會選出/catalog/cd 的所有子元素:
/catalog/cd/*

 
以下的語法會選出所有catalog的子元素中,包含有price作為子元素的元素。
/catalog/*/price

 
以下的語法會選出有兩層父節點,叫做price的所有元素。
/*/*/price

 
以下的語法會選擇出文件中的所有元素。
//*

 
要注意的是,想要存取不分層級的元素,XPath語法必須以兩個斜線開頭(//),想要存取未知元素才用星號(*),星號只能代表未知名稱的元素,不能代表未知層級的元素。
 
選擇分支
使用中括號可以選擇分支。以下的語法從catalog的子元素中取出第一個叫做cd的元素。XPath的定義中沒有第0元素這種東西。
/catalog/cd[1]

 
以下語法選擇catalog中的最後一個cd元素:(XPathj並沒有定義 first() 這種函式喔,用上例的 [1]就可以取出第一個元素。
/catalog/cd[last()]

 
以下語法選出含有price子元素的所有/catalog/cd元素。
/catalog/cd[price]

 
以下語法選出price元素的值等於10.90的所有/catalog/cd元素
/catalog/cd[price=10.90]

 
以下語法選出price元素的值等於10.90的所有/catalog/cd元素 的price元素
/catalog/cd[price=10.90]/price

 
選擇一個以上的路徑
使用Or運算元(|)就可以選擇一個以上的路徑。例如:
/catalog/cd/title | catalog/cd/artist

 
選擇所有title以及artist元素
//title | //artist

 
選擇所有title以及artist以及price元素
//title | //artist | //price

 
選擇屬性
在XPath中,除了選擇元素以外,也可以選擇屬性。屬性都是以@開頭。例如選擇文件中所有叫做country的屬性:
//@country
   
 
選擇所有含有country這個屬性的cd元素:
//cd[@country]
   
 
以下語法選擇出含有屬性的所有cd元素
//cd[@*]
   
 
以下語法選擇出country屬性值為UK的cd元素
//cd[@country='UK']

后面資料轉自:http://blog.csdn.net/luyifeiniu/article/details/626202


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM