利用msxml.dll解析xml檔案。
一般情況我們裝載操作xml檔案,不會頻繁。因此很容易忽略其中的記憶體洩露問題。但是如果操作不當其中的記憶體浪費還是令人難以容忍的。
最近做乙個檔案下栽處理的程式,其中下栽的連線資訊是通過解析xml來獲得。因此對於xml檔案的裝載和解析頻率非常的高。剛開始採用的方式是初始化庫coinitialize, 利用cocreateinstance建立ixmldomdocument然後裝載。可是到實際使用的時候才發現記憶體消耗的太嚴重了,就幾個任務下去程式占用的記憶體是以m為單位往**個不停。最鬱悶的是用cmemorystate來觀察,也只是看到了不斷的申請記憶體,並不報洩露。剛開始的時候還懷疑是設計的儲存資料的結構本身有問題。仔細查來查去,針對資料結構做了幾個小測試程式—— 很不幸的是,還真的有點問題。等把問題解決了 只是稍微好點。
看樣子主要問題還不是出在這裡。於是做了個測試程式,把每段**都拿過來做乙個迴圈一千遍的操作,看記憶體的狀態。這一看嚇一跳:就乙個pdoc->load(_bstr_t(lpszpath)); 就記憶體消耗瘋漲了。想了想大致猜到了問題出那裡了,每一次使用ixmldomdocument裝載之後都要釋放(release)的,看解析的時候原因同樣如此。雖然我對整個的這些ixmldomnodelist ixmldomelement ixmldomnode都有釋放的,但是在想法上也是針對於他們本身,在最後的時候選擇釋放的,而實際上是在每次取得這些內容並解析之後如果不在需要的話都是需要釋放的。把所有這些地方都改過來,果然就okay了。
回想起以前在做類似處理的時候由於都是單一性的操作,並且記憶體也不報洩露。就這麼自己把自己給忽悠咯。以前在查資料的時候也沒有仔細的注意到,好象強調這個的也不多。
下面給出修訂後的xml處理的**:
#define xml_node_tag "xmlnodename"
msxml2::ixmldomdocument * pdoc = null;
bool loadtoc(lpctstr lpszpath)
else
// assert(lpszpath!=null);
if (lpszpath == null) return false;
cocreateinstance (msxml::clsid_domdocument,
null, clsctx_inproc_server | clsctx_local_server,
msxml::iid_ixmldomdocument,
(lpvoid *)&pdoc);
if(!pdoc)
return false;
pdoc->put_async(variant_false);
hr = pdoc->load(_bstr_t(lpszpath));
if(!hr)
parse(pdoc);
}catch (...)
//trace(_t("success/n"));
return true; }
bool parse(msxml2::ixmldomdocument * pdoc)
#endif
proot->get_childnodes(&plist);
long lcount;
plist->get_length(&lcount);
for(int icount=0;icount get_item(icount,&pnode);
if (pnode == null) continue;
memset(buff,0,node_buff_max_length);
getnodename(pnode,buff);
if(wcscmp(buff,xml_node_tag)==0)
else
}
plist->release();
proot->release();
return true;}
inline bool getnodename(msxml2::ixmldomnode *pnode, const unsigned short* lpsz )
利用Xerces c庫解析XML
如下是乙個xml檔案 sample.xml 常用xml解析庫 庫1 xerces c 庫2 libxml2 庫3 expat 庫4 tinyxml 庫5 msxml include include include include include include include include inc...
利用MSXML解析XML文字 二
二 實現xml解析的說明 三 xml文件物件 xml dom 模型分析 xml dom物件提供了乙個標準的方法來操作儲存在xml文件中的資訊,dom應用程式設計介面 api 用來作為應用程式和xml文件之間的橋梁。dom可以認為是乙個標準的結構體系用來連線文件和應用程式 也可以是劇本語言 msxml...
利用GDataXML進行XML檔案解析
gdataxml 來看gdataxml,它是一種dom方式的解析類庫。dom實現的原理是把整個xml文件一次性讀出,放在乙個樹型結構裡。在需要的時候,查詢特定節點,然後對節點進行讀或寫。再次編譯,通過。注意 用這個解析你要對你的xml檔案的節點 也就是字典的鍵值非常了解 附上 1 由data轉為的x...