WM5.0下如何利用微软的MSXML解析.XML文件
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文件的根节点
if(SUCCEEDED(hr))
{
BSTR bsxml;
//解析XML文件,一层一层的解析
pNode->hasChildNodes(&vBool);
if(vBool == VARIANT_TRUE)
{
hr = pNode->get_nodeName(&bsxml);
//获取子节点的个数
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;
//获取孙节点的个数
pNode->get_childNodes(&pSubNodelist);
pNode->Release();
long leng;
pSubNodelist->get_length(&leng);
if (leng > 0)
{
IXMLDOMNode *pSubNode = NULL;
//解析最下层的节点
for(int i = 0; i < leng; ++i)
{
pSubNodelist->get_item(i,&pSubNode);
pSubNode->get_nodeName(&bsxml);
//判断节点的属性,如果是注释属性,则放弃
DOMNodeType ntValue;
pSubNode->get_nodeType((&ntValue);
if(NODE_COMMENT == ntValue)//也可以判断其他的属性,具体的查看MSDN
continue;;
//获取节点的属性个数
IXMLDOMElement* pElement = (IXMLDOMElement*)pSubNode;
IXMLDOMNamedNodeMap* pMap;
pElement->get_attributes(&pMap);
pSubNode->Release();
long len;
pMap->get_length(&len);
//循环读取节点的各个属性(值和名字)
for(int j = 0; j < len; ++j)
{
//如果还有下层的节点,继续循环
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的释放比较费时,不可频繁的使用,如果使用比较频繁,可能出现内存泄露。