最近因?yàn)轫?xiàng)目的需要,將一個(gè)應(yīng)用軟件的底層XML處理模塊進(jìn)行重寫,由MSDOM改用xmlLite來完成。XmlLite是微軟專門針對C++使用者開發(fā)的一個(gè)輕量級開發(fā)包,只具備基本的I/O功能。提供了IXmlReader, IXmlWriter對XML文件進(jìn)行簡單的讀寫操作。原理很簡單,在讀一個(gè)文件時(shí),循環(huán)讀取各個(gè)節(jié)點(diǎn),然后根據(jù)不同的節(jié)點(diǎn)類型讀取其相關(guān)屬性數(shù)據(jù)等。XMLLite中的數(shù)據(jù)類型主要封裝在XmlNodeType中,常使用到的有XmlNodeType_None, XmlNodeType_Element,XmlNodeType_EndElement等。在寫數(shù)據(jù)時(shí),主要根據(jù)不同的節(jié)點(diǎn)類型,調(diào)用相關(guān)的API來完成。值得注意的是,由于XMLLite只提供順序化寫的功能,因此在寫具有多個(gè)深度的節(jié)點(diǎn)類型時(shí),需要控制好WriteEndElement()函數(shù)的出現(xiàn)順序等,所以這些都可以通過函數(shù)的遞歸來完成。
由于XmlLite只提供簡單的讀寫等功能,因此,在實(shí)際應(yīng)用中,需要對XMLLite提供的功能進(jìn)行一定的封裝,從而提供自己的API功能。下面簡單說說我們采用的思路。在讀Xml文件時(shí),需要在加載過程建立XML文件的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。這可以通過兩種方式來完成,一種是在一個(gè)循環(huán)或者遞歸過程中,將整個(gè)XMLload進(jìn)來;另外一種方法是一次只加載一層節(jié)點(diǎn),然后遞歸加載其子節(jié)點(diǎn)。前面一種方法是在處理大XML文件時(shí),可能會有memory footprint問題。所以最終采用了后面的方法。
在實(shí)現(xiàn)過程中,我們采用了composite模式來組織XML文件樹結(jié)構(gòu)。通過使用list來建立樹結(jié)構(gòu)。全部操作封裝在一個(gè)類中。
有關(guān)相關(guān)原因,xmlLite的具體封裝實(shí)現(xiàn)方法就不提及了。開發(fā)過程中,遇到的主要難點(diǎn)是數(shù)據(jù)的讀寫和保存,關(guān)鍵是數(shù)據(jù)結(jié)構(gòu)的處理,其他部分都比較容易。
這我開通blog后的第一篇文章,呵呵,也不知道怎么寫好。以后會盡力寫好點(diǎn)^_^.