好久沒有在VC++里面解析XML了,昨天遇到一個問題,從昨天下午一直到今天上午,差不多搞了一天,才終于把問題解決了。
使用MSXML在VC++中解析XML文件時候,只需要做到下面幾點:
1、初始化COM庫,CoInitialize(NULL);可以放在InitInstance()函數里面。釋放COM庫,CoUninitialize();可以放在ExitInstance()函數里面。
2、在頭文件里面加入如下代碼
#import "MSXML6.dll" rename_namespace("MSXML6") named_guids
using namespace MSXML6;
#include <atlbase.h>需要解析的XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Address type="MAC-Address" xsi:type="tP_MAC-Address">
01-0C-CD-01-00-08
</Address>
</SCL>
HRESULT hr;
IXMLDOMDocument *pDoc=NULL;
CString strFileName;
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle="打開XML文件";
fileDlg.m_ofn.lpstrFilter="XML Files(*.xml)\0*.xml\0All Files(*.*)\0*.*\0\0";
fileDlg.m_ofn.lpstrDefExt="xml";
if(fileDlg.DoModal() != IDOK)
return;
strFileName=fileDlg.GetPathName(); //獲得要解析的XML文件的路徑名
ASSERT(!strFileName.IsEmpty());
if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,
CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(void**)&pDoc))) //創建Document對象
{
CComVariant vPath(strFileName);
VARIANT_BOOL isSuccessful;
pDoc->raw_load(vPath,&isSuccessful); //加載要解析的XML文件
if(isSuccessful!=VARIANT_TRUE)
{
AfxMessageBox("wrong!");
return;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Address type="MAC-Address" xsi:type="tP_MAC-Address">
01-0C-CD-01-00-08
</Address>
</SCL>我原來的解析代碼是:
IXMLDOMElement *pRootElement=NULL;
IXMLDOMNode *pRootNode=NULL;
IXMLDOMNamedNodeMap *pAttrMap=NULL;
IXMLDOMNode *pAttrNode=NULL;
IXMLDOMNode *pAddrNode=NULL;
CString strName,strText;
BSTR bsName,bsText;
hr=pDoc->get_documentElement(&pRootElement);
if(SUCCEEDED(hr) && (pRootElement!=NULL))
{
hr=pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pRootNode);
if(SUCCEEDED(hr))
{
hr=pRootNode->get_firstChild(&pAddrNode);
if(SUCCEEDED(hr) && (pAddrNode!=NULL))
{
pAddrNode->get_attributes(&pAttrMap);
long length=0;
pAttrMap->get_length(&length);
for(int i=0;i<length;i++)
{
hr=pAttrMap->get_item(i,&pAttrNode);
if(SUCCEEDED(hr) && (pAttrNode!=NULL))
{
pAttrNode->get_baseName(&bsName);
pAttrNode->get_text(&bsText);
strName=bsName;
strText=bsText;
SysFreeString(bsName);
SysFreeString(bsText);
}
}
}
}
}修改后的VC++代碼如下
IXMLDOMElement *pRootElement=NULL;
IXMLDOMNode *pRootNode=NULL;
IXMLDOMNamedNodeMap *pAttrMap=NULL;
IXMLDOMNode *pAttrNode=NULL;
IXMLDOMNode *pAddrNode=NULL;
CString strName,strText;
BSTR bsName,bsText;
hr=pDoc->get_documentElement(&pRootElement);
if(SUCCEEDED(hr) && (pRootElement!=NULL))
{
hr=pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pRootNode);
if(SUCCEEDED(hr))
{
hr=pRootNode->get_firstChild(&pAddrNode);
if(SUCCEEDED(hr) && (pAddrNode!=NULL))
{
pAddrNode->get_attributes(&pAttrMap);
long length=0;
pAttrMap->get_length(&length);
for(int i=0;i<length;i++)
{
hr=pAttrMap->get_item(i,&pAttrNode);
if(SUCCEEDED(hr) && (pAttrNode!=NULL))
{
pAttrNode->get_nodeName(&bsName);
pAttrNode->get_text(&bsText);
strName=bsName;
strText=bsText;
SysFreeString(bsName);
SysFreeString(bsText);
}
}
}
}
}
