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