rapidxml,乙個快速的xml庫

2021-09-09 00:10:48 字數 2015 閱讀 7112

近來找到乙個快速的xml庫,試用了一下,方法和現在使用的tinyxml差不多,很容易上手,如果有機會可以移植到專案裡面試試

自從用了xml後對他是又愛又恨,他的確能代替配置檔案,但是當檔案容量大到一定量的時候災難就降臨了,比如讀取乙個50m的xml檔案,往往讀取花上10秒,解析再花上20秒,還要占用大量記憶體空間,十分頭痛.所以實際專案中都會將xml再轉為二進位制檔案來處理,但是xml的靈活性的確很方便,如果rapidxml能接近二進位制的速度,當然就太好啦,還沒有測試過,下面是一些介紹.

貌似tinyxml會遇到unicode障礙,rapidxml不會,如果專案要做多語言版本就必須面臨解決這個問題...

rapidxml是乙個快速的xml庫,官方**: 根據manual看到,他竟然比tinyxml快了50-100倍

目前我公司開發的nexus engine的底層物件序列化使用了tinyxml來讀寫xml檔案。tinyxml有兩個不爽的地方,一是它的介面使用file*,另外乙個是它對 wchar_t不能很好的支援。前陣子看boost庫的更新中多了乙個propertytree,他在處理xml時用到了另外乙個小的庫 –rapidxml。既然間接的是boost庫的一部分,所以是值得一試的。於是找到其官方**(

首先就是速度,據它自己宣稱比tinyxml快30到60倍,比xerces dom快50到100倍!詳細的測試比較請見其使用者手冊(manual.html

)的「4. performance 」一節。

其次它的設計非常的簡潔,只依賴於標準庫中的幾個基本的類。它的輸入輸出都是字串,這樣很好,乙個庫就應該關注自己核心的內容,做盡量少的事情。它的api其實和tinyxml倒是有幾分相似,用過tinyxml的人應該很容易上手:

tinyxml主要介面類     rapidxml的主要介面類

tinyxml主要介面類rapidxml的主要介面類

class tixmldocument

templateclass xml_document

class tixmlnode

templateclass xml_node

class tixmlattribute

templateclass xml_attribute

下面還是看乙個具體的例子來體驗一下,下面是tinyxml官方教程中建立xml文件的一段**:

void build_******_doc( )

下面是使用rapidxml實現類似功能的**:

string text; rapidxml::print(std::back_inserter(text), doc, 0);

// write text to file by yourself }

下面是使用rapidxml分析xml的樣例**:

void parse_doc_by_rapidxml(char* xml_doc)

前兩天有朋友問,我的slimxml有沒有和rapidxml對比過效率?我是第一次聽說這個庫,更不用說對比效率了,於是上他們**看了下。

好傢伙,居然號稱比tinyxml快30~60倍,而且是boost.propertytree的預設xml解析器。

於是有點好奇,因為以前也沒有特別關心過slimxml的效率。

測試物件是三個庫從記憶體字串解析xml的函式,這樣能排除從硬碟上讀檔案這種不穩定因素的干擾,而且rapidxml貌似只支援從記憶體裡解析

要說明的是,rapidxml的這個parse是乙個模板函式,必須給乙個flag的引數,我測試的時候給的是預設的0

測試結果,解析這個3.3萬行,1.5m大小的xml,三個庫分別花了

比較欣慰的是,在我並沒有很關注效率的情況下,slimxml仍然比tinyxml快2.5倍。slimxml走的是簡單小巧路線,源**只有32k,而tinyxml和rapidxml的原始碼分別是147k和141k,有這樣的效率可以滿意了。在我有很多空閒以前,估計我也不會再去優化它,因為這個庫主要還是針對幾十上百行的小檔案,解析特別大的xml不在我考慮的範圍之內。

rapidxml,乙個快速的xml庫

近來找到乙個快速的xml庫,試用了一下,方法和現在使用的tinyxml差不多,很容易上手,如果有機會可以移植到專案裡面試試 自從用了xml後對他是又愛又恨,他的確能代替配置檔案,但是當檔案容量大到一定量的時候災難就降臨了,比如讀取乙個50m的xml檔案,往往讀取花上10秒,解析再花上20秒,還要占用...

就乙個快速排序。。。

話說,每次寫題的時候我都是呼叫stl的sort,自己卻還是很難快速寫出乙個快排。正好作業布置這個了。就寫一下,熟練一下,順便背一下記住。萬一以後面試問到了,也可以秒了。include include include using namespace std const int maxn 10000 5...

快速操作乙個list

取出list物件中的某個屬性,放在另乙個list中 把list中的資料轉為字串,用,號分隔 long userarray long convertutils.convert userids.split long.class 獲取單個 dbdictionary dictionary list.stre...