在iPhone開發中,XML的解析有不少選擇,iOS SDK提供了NSXMLParser和libxml2兩個類庫,另外還有不少第三方類庫可選,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。問題是應該選擇哪個呢?html
解析 XML 一般有兩種方式,DOM 和 SAX:ios
DOM解析XML時,讀入整個XML文檔並構建一個駐留內存的樹結構(節點樹),經過遍歷樹結構能夠檢索任意XML節點,讀取它的屬性和值。並且一般狀況下,能夠藉助XPath,直接查詢XML節點。git
SAX解析XML,是基於事件通知的模式,一邊讀取XML文檔一邊處理,沒必要等整個文檔加載完以後才採起操做,當在讀取解析過程當中遇到須要處理的對象,會發出通知對其進行處理。github
通常在iOS平臺下,比較經常使用的XML解析類庫有以下幾種:objective-c
NSXMLParser,http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html ,這是一個SAX方式解析XML的類庫,默認包含在iOS SDK中,使用也比較簡單。app
libxml2,http://xmlsoft.org/,是一套默認包含在iOS SDK中的開源類庫,它是基於C語言的API,因此使用起來可能不如NSXML方便。這套類庫同時支持DOM和SAX解析,libxml2的SAX解析方式仍是很是酷的,由於它能夠邊讀取邊解析,尤爲是在從網上下載一個很大的XML文件,就能夠一邊下載一邊對已經下載好的內容進行解析,極大的提升解析效率。iphone
TBXML,http://www.tbxml.co.uk/TBXML/TBXML_Free.html,這是一套輕量級的DOM方式的XML解析類庫,有很好的性能和低內存佔用,不過它不對XML格式進行校驗,不支持XPath,而且只支持解析,不支持對XML進行修改。性能
TouchXML,https://github.com/TouchCode/TouchXML,這也是一套DOM方式的XML解析類庫,支持XPath,不支持XML的修改。ui
KissXML,http://code.google.com/p/kissxml/,這是一套基於TouchXML的XML解析類庫,和TouchXML相比,支持了XML的修改。google
TinyXML,http://www.grinninglizard.com/tinyxml/,這是一套小巧的基於C語言的DOM方式進行XML解析的類庫,支持對XML的讀取和修改,不直接支持XPath,須要藉助另外一個相關的類庫TinyXPath才能夠支持XPath。
GDataXML,http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/,這是一套Google開發的DOM方式XML解析類庫,支持讀取和修改XML文檔,支持XPath方式查詢。
那麼對於如何在項目中選擇合適的XML解析類庫呢?網上已經有人對這幾款XML類庫作過度析和對比,可參考《How To Choose The Best XML Parser for Your iPhone Project》http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project 一文,基本比較準確和客觀,文中建議:
若是是讀取很小的XML文檔,性能基本上沒有什麼差異,不過從調用的方便性來講,建議使用TouchXML、KissXML或GDataXML
若是是須要讀取和修改XML文檔,建議使用KissXML或GDataXML
若是須要讀取很是大的XML文檔,則建議使用libxml2或TBXML
若是你不想去調用第三方類庫,那麼使用NSXML也能夠
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」到列表中
在須要調用GDataXML的代碼文件頭部,加入:
#import 「GDataXMLNode.h」
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」
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」
讀取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];