最開始用的libxml2,linux上倒是方便,但為了在win上使用這個(gè),需要編譯一大堆附加庫,還要帶上大家伙,本來是為了圖方便,沒想到更加的麻煩,而且在實(shí)際使用中,也并不順手。鑒于此,我放棄了libxml2。
之后又瞄準(zhǔn)了arabica,一個(gè)針對(duì)C++的解析庫,嚴(yán)格的說是一組包裝類,在底層還是靠expat等其他引擎來解析xml的。這回看起來爽多了,不用擔(dān)心平臺(tái)問題了。在實(shí)際使用中,引了一大堆的頭文件,繼承了一堆父類,雖然類責(zé)任更加明確了,但這確實(shí)不是我所喜歡的方式,簡單就是最好,這是我所推崇的。盡管如此,為了圖便宜,我還是沒有放棄采用arabica,甚至為它禁用了一個(gè)原先工作正常,但現(xiàn)在有沖突的標(biāo)準(zhǔn)lib文件(可惡的LN2005錯(cuò)誤),但最后還是發(fā)現(xiàn),arabica在一些地方并不完善,文檔也不全面,很費(fèi)了一番周折才work起來不說,出了問題還要搞半天,我只是想要簡單的解析功能,實(shí)在不想去研究透澈一個(gè)第三方庫。
一氣之下,決定自己封裝expat,花了1個(gè)多小時(shí),整個(gè)世界清靜了,現(xiàn)在一起看起來那么干爽,一切都回歸到預(yù)想與控制中。功能可能不如第三方庫全面,但也足夠了,而且需要的話可以再添加。長嘆一口氣,主席說過,自己動(dòng)手,豐衣足食。
至于再高一層,我并沒有像wildfire那樣,用pull的方式,邊執(zhí)行邏輯,邊解析。
我希望能得到pull模型給程序結(jié)構(gòu)帶來的一些好處,但又不想把解析xml的動(dòng)作帶到整個(gè)程序中,最好能在一處解析完,但又能繼續(xù)使用pull模型。為此,設(shè)計(jì)了XmlBlock對(duì)象的一個(gè)隊(duì)列結(jié)構(gòu)來模擬pull操作,也受到了ACE中ACE_Message_Block機(jī)制的一些影響。
后來又仔細(xì)想了想,其實(shí)內(nèi)部利用std::list就可以了,做一個(gè)wrapper,公布一個(gè)一次性的ForwardIterator,就可以模擬出Stream操作的特點(diǎn)了,現(xiàn)在還沒有必要做的像ACE_Message_Block那樣精。
具體做法,今后會(huì)寫進(jìn)文檔中。