最受歡迎的XML分析器簡介:

最受歡迎的XML分析器簡介:
iPhone最流行的XML解析器,以及每個一簡要介紹:
        •        NSXMLParser是一個SAX解析器SDK中包含的iPhone默認的。 這是寫在Objective - C和使用非常簡單,但也許沒有那麼容易,因爲DOM模型。
        •        libxml2的是一個開放源碼庫,包括iPhone SDK的默認情況下使用。 這是一個基於C的API,所以使用起來可能不如NSXML方便。 該庫同時支持DOM和SAX處理。 該處理器的libxml2的SAX特別的酷,因爲它有一個能夠解析它的獨特功能正在讀取數據。 例如,你可以從網絡上閱讀大量的XML文檔並顯示數據,您正在閱讀它給用戶,而你還在下載。
        •        TBXML是一個輕量級的DOM XML解析器設計得儘可能快,而資源消耗少的內存。 它節省了驗證時間不執行,不支持XPath和由被只讀 - 即你可以閱讀它的XML,但是你不能再修改XML和寫回來。
        •        TouchXML是NSXML風格的DOM的XML解析器的iPhone。 TBXML一樣,它也是隻讀的,但它不像TBXML支持XPath。
        •        KissXML是另一個NSSXML風格的DOM XML解析器的iPhone,其實TouchXML的基礎上。 主要區別是KissXML還支持編輯和編寫XML以及閱讀。
        •        TinyXML的是一個小型的C -基於DOM的XML解析器頭只包含4個C文件和兩個。 它同時支持讀取和編寫XML文件,但它不支持自己的XPath。 但是,您可以使用相關的庫 - 該TinyXPath - 。
        •        GDataXML是另一個NSXML風格的DOM XML解析器的iPhone,谷歌開發作爲圖書館的一部分,他們的Objective - C的客戶端。 短短的m文件和一個頭組成,它同時支持閱讀和編寫XML文檔和XPath查詢。


正題:

解析 XML 通常有兩種方式,DOM 和 SAX:DOM解析XML時,讀入整個XML文檔並構建一個駐留內存的樹結構(節點樹),通過遍歷樹結構可以檢索任意XML節點,讀取它的屬性和值。

iOSXML解析是本文要介紹的內容,在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解析類庫有如下幾種:

NSXMLParser,http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html 

這是一個SAX方式解析XML的類庫,默認包含在iOS SDK中,使用也比較簡單。

libxml2,http://xmlsoft.org/,是一套默認包含在iOS SDK中的開源類庫,它是基於C語言的API,所以使用起來可能不如NSXML方便。這套類庫同時支持DOM和SAX解析,libxml2的SAX解析方式還是非常酷的,因爲它可以邊讀取邊解析,尤其是在從網上下載一個很大的XML文件,就可以一邊下載一邊對已經下載好的內容進行解析,極大的提高解析效率。

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的修改。

KissXML,http://code.google.com/p/kissxml,這是一套基於TouchXML的XML解析類庫,和TouchXML相比,支持了XML的修改。

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也可以

安裝說明

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”到列表中

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

  1. #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”到列表中

iOS中xml的解析

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

  1. #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的代碼文件頭部,加入:

  1. #import “TBXML.h” 

使用說明

  1. GDataXML 

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

複製代碼
1 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];  
2 NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];  
3 NSError *error;  
4 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];  
5 if (doc == nil) { return nil; }  
6 NSLog(@"%@", doc.rootElement);  
7 [doc release];  
8 [xmlData release]; 
複製代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章