MFC 读写xml文件

直接程序:

在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();

=============================================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值