直接程序:
在MFC中利用IXMLDOMDocumentPtr类来操作XML格式的文件.
首先:安装msxml.msi,下载地址
然后:在stdafx.h文件中,加载DLL文件
#import <msxml4.dll>
宏定义一下
#define XMLDocPtr MSXML2::IXMLDOMDocumentPtr
#define XMLNodePtr MSXML2::IXMLDOMNodePtr
#define XMLNodeListPtr MSXML2::IXMLDOMNodeListPtr
下面是封装好的,两个获取节点内容的函数.
//获取XML节点的值,函数类型为void或int,用于获取Cstring的值
void GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc, CString& strValue)
{
if (pNode == NULL)
{
strValue = "";
return;
}
XMLNodePtr pNodeValue = pNode;
_variant_t v;
if (strDesc != "")
pNodeValue = pNode->selectSingleNode(strDesc);
if (pNodeValue == NULL)
{
strValue = "";
return;
}
v = pNodeValue->GetnodeTypedValue();
strValue = CString(v.bstrVal);
SysFreeString(v.bstrVal);
v.Clear();
}
//获取XML节点的值,函数类型为void或int,用于获取int的值
int GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc)
{
if (pNode == NULL)
return 0;
_variant_t v;
XMLNodePtr pNodeValue = pNode;
CString strValue;
if (strDesc != "")
pNodeValue = pNode->selectSingleNode(strDesc);
if (pNodeValue == NULL)
return 0;
v = pNodeValue->GetnodeTypedValue();
strValue = CString(v.bstrVal);
SysFreeString(v.bstrVal);
v.Clear();
return atoi(strValue);
}
终于到了,真正读取XML文件的时候了。
//创建XML实例
HRESULT hr;
XMLDocPtr pDoc;
hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if (FAILED(hr))
{
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
break;
}
CString xmlfilePath = "..\\xxx.xml";
pDoc->load((LPCTSTR)xmlfilePath);//导入要读取的xml文件
/*若要读取xlm文件的格式为:
<ZCs Data_Familly="DF18">
<ZC ID="7681" Name="ZC1">
<SSID>1</SSID>
<Urbalis_Sector_ID>1</Urbalis_Sector_ID>
<ZC_Area_ID>1</ZC_Area_ID>
<CBI_ID_List>
<CBI_ID>15363</CBI_ID>
<CBI_ID>15364</CBI_ID>
</CBI_ID_List>
<ATS_ID_List>
<ATS_ID>2561</ATS_ID>
</ATS_ID_List>
<Max_SCT_Validity_Distance />
</ZC>
</ZCs>*/
XMLNodePtr pNode = pDoc->selectSingleNode((LPCTSTR)"//ZCs/ZC[@ID='7681']");//获得单个节点的信息
if (pNode)
{
int id = GetXMLNodeValue(pNode, "@ID");//注意ID这样的位置是要加@的 获取int
CString CBIname = "";
GetXMLNodeValue(pNode, "@Name", CBIname);//获取CString
XMLNodeListPtr pList = pNode->selectNodes((LPCTSTR)"CBI_ID_List/CBI_ID");//获得多个节点的信息存放在列表中
for (int j = 0;j < pList->Getlength();j++)//该CBI_ID可能有多个,遍历一下
{
XMLNodePtr pNode_CBIId = pList->Getitem(j);
int bid = GetXMLNodeValue(pNode_CBIId , "");
}
}
上面例子就把VC读取XML文件的大部分操作都用到了,总之万变不离其中!
===========================================================================================================
使用MSXML.DLL读写XML;
文件顶部加入
#import "msxml3.dll";
using namespace MSXML2;
//这两句作用是,在程序的文件夹下生成MSXML3.TLH和MSXML3.TLI两个文件;
---------------------------------------------------------
创建一个XML文件;
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;
MSXML2::IXMLDOMElementPtr XMLROOT;
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLROOT = XMLDOC->createElement("ROOT");
XMLROOT->setAttribute("ID","12345"); //设置根标签的属性;
XMLDOC->appendChild(XMLROOT);
CString TMP;
MSXML2::IXMLDOMElementPtr XMLNODE;
for(int I=0;I<10;I++)
{
TMP.Format("%d",I);
XMLNODE = XMLDOC->createElement((_bstr_t)("NODE"+TMP));
XMLNODE->put_text((_bstr_t)"NODETEXTS");//设置标签的文本内容;
XMLNODE->setAttribute("ID",(_variant_t)TMP);//设置标签的属性及内容;
XMLNODE->setAttribute("NAME","NODENAME");
XMLROOT->appendChild(XMLNODE);
}
XMLDOC->save("XMLTEST.XML");
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
------------------------------------------------------------------
读取一个XML;
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;
MSXML2::IXMLDOMElementPtr XMLROOT;
MSXML2::IXMLDOMElementPtr XMLELEMENT;
MSXML2::IXMLDOMNodeListPtr XMLNODES; //某个节点的所以字节点
MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;//某个节点的所有属性;
MSXML2::IXMLDOMNodePtr XMLNODE;
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLDOC->load("XMLTEST.XML");
XMLROOT = XMLDOC->GetdocumentElement();//获得根节点;
XMLROOT->get_childNodes(&XMLNODES);//获得根节点的所有子节点;
long XMLNODESNUM,ATTSNUM;
XMLNODES->get_length(&XMLNODESNUM);//获得所有子节点的个数;
CString TMP;
TMP.Format("%d",XMLNODESNUM);
MessageBox(TMP);
for(int I=0;I<XMLNODESNUM;I++)
{
XMLNODES->get_item(I,&XMLNODE);//获得某个子节点;
XMLNODE->get_attributes(&XMLNODEATTS);//获得某个节点的所有属性;
XMLNODEATTS->get_length(&ATTSNUM);//获得所有属性的个数;
for(int J=0;J<ATTSNUM;J++)
{
XMLNODEATTS->get_item(J,&XMLNODE);//获得某个属性;
CString T1 = (char*)(_bstr_t)XMLNODE->nodeName;
CString T2 = (char*)(_bstr_t)XMLNODE->text;
MessageBox(T1+" = "+T2);
}
//MessageBox((_bstr_t)XMLNODE->nodeName+": "+(_bstr_t)XMLNODE->text);
}
return;
//XMLDOC->save("XMLTEST.XML");
XMLNODES.Release();
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
---------------------------------------------------------
总结:
XML文件档类型:MSXML2::IXMLDOMDocumentPtr;
单个元素类型:MSXML2::IXMLDOMElementPtr;
单个节点类型:MSXML2::IXMLDOMNodePtr;
所有子节点类型:MSXML2::IXMLDOMNodeListPtr;
所有属性类型:MSXML2::IXMLDOMNamedNodeMapPtr;
获得节点个数的方法:get_length();
获得所有子节点的方法:get_childNodes();
获得指定节点的方法:get_item(索引号,单个节点类型变量);
写入单个节点的文本内容方法:put_text((_bstr_t)"内容");
获得单个节点的文本内容属性:XMLNODE->text;
获得单个属性的内容属性:XMLNODEATT->text;
节点名的属性为:XMLNODE->nodeName;
---------------------------------------------------------------
XML创建文件一般过程:
::CoInitialize(NULL);
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLROOT = XMLDOC->createElement("ROOT");//创建文件;
操作文件.....................
XMLDOC->save("XMLTEST.XML");//保存文件;
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
------------------------------------------------------------------------------
加载文件过程序:
::CoInitialize(NULL);
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLDOC->load("XMLTEST.XML");
文件操作.........................
XMLDOC->save("XMLTEST.XML");//可以保存对文件的修改;
XMLNODES.Release();
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
==============================================================================
==============================================================================
使用MSXML.DLL读写XML;
文件顶部加入
#import "msxml3.dll";
using namespace MSXML2;
//这两句作用是,在程序的文件夹下生成MSXML3.TLH和MSXML3.TLI两个文件;
---------------------------------------------------------
创建一个XML文件;
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;
MSXML2::IXMLDOMElementPtr XMLROOT;
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLROOT = XMLDOC->createElement("ROOT");
XMLROOT->setAttribute("ID","12345"); //设置根标签的属性;
XMLDOC->appendChild(XMLROOT);
CString TMP;
MSXML2::IXMLDOMElementPtr XMLNODE;
for(int I=0;I<10;I++)
{
TMP.Format("%d",I);
XMLNODE = XMLDOC->createElement((_bstr_t)("NODE"+TMP));
XMLNODE->put_text((_bstr_t)"NODETEXTS");//设置标签的文本内容;
XMLNODE->setAttribute("ID",(_variant_t)TMP);//设置标签的属性及内容;
XMLNODE->setAttribute("NAME","NODENAME");
XMLROOT->appendChild(XMLNODE);
}
XMLDOC->save("XMLTEST.XML");
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
------------------------------------------------------------------
读取一个XML;
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;
MSXML2::IXMLDOMElementPtr XMLROOT;
MSXML2::IXMLDOMElementPtr XMLELEMENT;
MSXML2::IXMLDOMNodeListPtr XMLNODES; //某个节点的所以字节点
MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;//某个节点的所有属性;
MSXML2::IXMLDOMNodePtr XMLNODE;
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLDOC->load("XMLTEST.XML");
XMLROOT = XMLDOC->GetdocumentElement();//获得根节点;
XMLROOT->get_childNodes(&XMLNODES);//获得根节点的所有子节点;
long XMLNODESNUM,ATTSNUM;
XMLNODES->get_length(&XMLNODESNUM);//获得所有子节点的个数;
CString TMP;
TMP.Format("%d",XMLNODESNUM);
MessageBox(TMP);
for(int I=0;I<XMLNODESNUM;I++)
{
XMLNODES->get_item(I,&XMLNODE);//获得某个子节点;
XMLNODE->get_attributes(&XMLNODEATTS);//获得某个节点的所有属性;
XMLNODEATTS->get_length(&ATTSNUM);//获得所有属性的个数;
for(int J=0;J<ATTSNUM;J++)
{
XMLNODEATTS->get_item(J,&XMLNODE);//获得某个属性;
CString T1 = (char*)(_bstr_t)XMLNODE->nodeName;
CString T2 = (char*)(_bstr_t)XMLNODE->text;
MessageBox(T1+" = "+T2);
}
//MessageBox((_bstr_t)XMLNODE->nodeName+": "+(_bstr_t)XMLNODE->text);
}
return;
//XMLDOC->save("XMLTEST.XML");
XMLNODES.Release();
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
---------------------------------------------------------
总结:
XML文件档类型:MSXML2::IXMLDOMDocumentPtr;
单个元素类型:MSXML2::IXMLDOMElementPtr;
单个节点类型:MSXML2::IXMLDOMNodePtr;
所有子节点类型:MSXML2::IXMLDOMNodeListPtr;
所有属性类型:MSXML2::IXMLDOMNamedNodeMapPtr;
获得节点个数的方法:get_length();
获得所有子节点的方法:get_childNodes();
获得指定节点的方法:get_item(索引号,单个节点类型变量);
写入单个节点的文本内容方法:put_text((_bstr_t)"内容");
获得单个节点的文本内容属性:XMLNODE->text;
获得单个属性的内容属性:XMLNODEATT->text;
节点名的属性为:XMLNODE->nodeName;
---------------------------------------------------------------
XML创建文件一般过程:
::CoInitialize(NULL);
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLROOT = XMLDOC->createElement("ROOT");//创建文件;
操作文件.....................
XMLDOC->save("XMLTEST.XML");//保存文件;
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
------------------------------------------------------------------------------
加载文件过程序:
::CoInitialize(NULL);
HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(HR))
{
MessageBox("faild!!");
return;
}
XMLDOC->load("XMLTEST.XML");
文件操作.........................
XMLDOC->save("XMLTEST.XML");//可以保存对文件的修改;
XMLNODES.Release();
XMLNODE.Release();
XMLROOT.Release();
XMLDOC.Release();
::CoUninitialize();
=============================================================================================