MSXL是Microsoft XML 分析器,是基于COM的,如果是在Windows平臺用起來比較方便。WM5.0也有MSXML,不用用法和其他Windows平臺下還是有些差異的。
首先要包含頭文件“Msxml2.h”,下面是代碼:
IXMLDOMDocument *pDoc = NULL;
IXMLDOMNodeList *pNodelist = NULL;
IXMLDOMNode *pNode = NULL;
IXMLDOMElement *pRootElement = NULL;
if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))//初始化COM組件
{
if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)))
{
VARIANT vFile;
vFile.vt = VT_BSTR ;
VARIANT_BOOL vBool;
vFile.bstrVal = SysAllocString(FileName);//.XML文件名
pDoc->load(vFile,&vBool);//加載XML文件
if(vBool != VARIANT_TRUE)
return ;
/////////////////////////
HRESULT hr;
hr = pDoc->get_documentElement(&pRootElement);
if(SUCCEEDED(hr))
{
hr = pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pNode);//獲取XML文件的根節(jié)點
if(SUCCEEDED(hr))
{
BSTR bsxml;
//解析XML文件,一層一層的解析
pNode->hasChildNodes(&vBool);
if(vBool == VARIANT_TRUE)
{
hr = pNode->get_nodeName(&bsxml);
//獲取子節(jié)點的個數(shù)
long value;
pNode->get_childNodes(&pNodelist);
pNode->Release();
pNodelist->get_length(&value);
for(int k = 0; k < value; ++ k)
{
BSTR bsxml1;
pNodelist->get_item(k,&pNode);
pNode->get_nodeName(&bsxml1);
IXMLDOMNodeList *pSubNodelist = NULL;
//獲取孫節(jié)點的個數(shù)
pNode->get_childNodes(&pSubNodelist);
pNode->Release();
long leng;
pSubNodelist->get_length(&leng);
if (leng > 0)
{
IXMLDOMNode *pSubNode = NULL;
//解析最下層的節(jié)點
for(int i = 0; i < leng; ++i)
{
pSubNodelist->get_item(i,&pSubNode);
pSubNode->get_nodeName(&bsxml);
//判斷節(jié)點的屬性,如果是注釋屬性,則放棄
DOMNodeType ntValue;
pSubNode->get_nodeType((&ntValue);
if(NODE_COMMENT == ntValue)//也可以判斷其他的屬性,具體的查看MSDN
continue;;
//獲取節(jié)點的屬性個數(shù)
IXMLDOMElement* pElement = (IXMLDOMElement*)pSubNode;
IXMLDOMNamedNodeMap* pMap;
pElement->get_attributes(&pMap);
pSubNode->Release();
long len;
pMap->get_length(&len);
//循環(huán)讀取節(jié)點的各個屬性(值和名字)
for(int j = 0; j < len; ++j)
{
//如果還有下層的節(jié)點,繼續(xù)循環(huán)
IXMLDOMNode* nameItem;
VARIANT var;
pMap->get_item(j,&nameItem);
//獲取屬性名
BSTR NAME;
nameItem->get_nodeName(&NAME);
//獲取屬性值
nameItem->get_nodeValue(&var);
LPWSTR VAL = var.bstrVal;
int a = 9;
}
}
pSubNodelist->Release();
}
}
pNodelist->Release();
}
else
pNode->Release();
}
}
//////////////////////////
pDoc->Release();
}
CoUninitialize();
}
上面的代碼可以用于win32和MFC工程,比較方便。 注意:這個COM的釋放比較費時,不可頻繁的使用,如果使用比較頻繁,可能出現(xiàn)內(nèi)存泄露。