vc中操作Xml

http://www.firstobject.com/dn_markup.htm
DotNet中使用xml相对比较轻松,在vc中操作xml,有些繁琐。最近在网络上得知CMarkup比较好用,于是试了下,还好,就把部分例子写出来。以后有时间的话,再写清楚点。

1. 生成UserInfo.xml

 

  1. CMarkup xml;    
  2. xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");    
  3. xml.AddElem("UserInfo");    
  4. xml.IntoElem();    
  5. xml.AddElem("UserID","luo");    
  6. xml.AddElem("UserID","lin");    
  7. xml.OutOfElem();    
  8. xml.Save("UserInfo.xml");   

CMarkup xml; xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"); xml.AddElem("UserInfo"); xml.IntoElem(); xml.AddElem("UserID","luo"); xml.AddElem("UserID","lin"); xml.OutOfElem(); xml.Save("UserInfo.xml");

 

2. 浏览特定元素

 

  1. //----查看所有UserID----    
  2. CMarkup xml;    
  3. xml.Load("UserInfo.xml");    
  4. BOOL bFind = true;    
  5. xml.ResetMainPos();    
  6. while (xml.FindChildElem("UserID");)    
  7. {    
  8.       //此时接点还是父接点    
  9.         CString strTagName = _T("");    
  10.         CString strData = _T("");    
  11.         strTagName = xml.GetChildTagName();    
  12.         strData = xml.GetChildData();    
  13.         TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);    
  14. }    
  15.       /********************这样也可以******************   
  16.       CMarkup xml;   
  17.       xml.Load("UserInfo.xml");   
  18.       BOOL bFind = true;   
  19.       xml.ResetMainPos();   
  20.         
  21.       while (xml.FindChildElem("UserID");)   
  22.       {   
  23.                     xml.IntoElem();   
  24.                     CString strTagName = _T("");   
  25.                     CString strData = _T("");   
  26.                     strTagName = xml.GetTagName();   
  27.                     strData = xml.GetData();   
  28.                     TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);   
  29.                     xml.OutOfElem();   
  30.       }*/    
  31.       /**************这样也可以**********************   
  32.       CMarkup xml;   
  33.       xml.Load("UserInfo.xml");   
  34.       BOOL bFind = true;   
  35.       xml.ResetMainPos();   
  36.       xml.FindElem();  //UserInfo   
  37.       xml.IntoElem();   
  38.       while (xml.FindElem("UserID");)   
  39.       {   
  40.                     CString strTagName = _T("");   
  41.                     CString strData = _T("");   
  42.                     strTagName = xml.GetTagName();   
  43.                     strData = xml.GetData();   
  44.                     TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);   
  45.       }   
  46.       */    
  47. //-------------结果----------    
  48. ---tagName:UserID,Data:luo--    
  49. ---tagName:UserID,Data:lin—   

//----查看所有UserID---- CMarkup xml; xml.Load("UserInfo.xml"); BOOL bFind = true; xml.ResetMainPos(); while (xml.FindChildElem("UserID");) { //此时接点还是父接点 CString strTagName = _T(""); CString strData = _T(""); strTagName = xml.GetChildTagName(); strData = xml.GetChildData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); } /********************这样也可以****************** CMarkup xml; xml.Load("UserInfo.xml"); BOOL bFind = true; xml.ResetMainPos(); while (xml.FindChildElem("UserID");) { xml.IntoElem(); CString strTagName = _T(""); CString strData = _T(""); strTagName = xml.GetTagName(); strData = xml.GetData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); xml.OutOfElem(); }*/ /**************这样也可以********************** CMarkup xml; xml.Load("UserInfo.xml"); BOOL bFind = true; xml.ResetMainPos(); xml.FindElem(); //UserInfo xml.IntoElem(); while (xml.FindElem("UserID");) { CString strTagName = _T(""); CString strData = _T(""); strTagName = xml.GetTagName(); strData = xml.GetData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); } */ //-------------结果---------- ---tagName:UserID,Data:luo-- ---tagName:UserID,Data:lin—

 

3. 修改

 

  1. //--------把UserID为”luo”改为”flypigluo”-----------    
  2. BOOL bLoadXml = false;    
  3. CMarkup xml;    
  4. bLoadXml = xml.Load("UserInfo.xml");    
  5.       if (bLoadXml)    
  6.       {    
  7.               CString strUserID = _T("");    
  8.               xml.ResetMainPos();    
  9.               xml.FindElem();    
  10.               xml.IntoElem();    
  11.               while (xml.FindElem("UserID"))    
  12.               {    
  13.                     strUserID = xml.GetData();    
  14.                     if (strUserID=="luo")    
  15.                     {    
  16.                             xml.SetData(CString("flypig")+strUserID);    
  17.                             xml.Save("UserInfo.xml");    
  18.                             break;    
  19.                     }    
  20.               }    
  21.       }   

//--------把UserID为”luo”改为”flypigluo”----------- BOOL bLoadXml = false; CMarkup xml; bLoadXml = xml.Load("UserInfo.xml"); if (bLoadXml) { CString strUserID = _T(""); xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); while (xml.FindElem("UserID")) { strUserID = xml.GetData(); if (strUserID=="luo") { xml.SetData(CString("flypig")+strUserID); xml.Save("UserInfo.xml"); break; } } }

 

4. 添加

4.1  添在最后面(使用的是AddElem)

 

  1. //加在最后面    
  2.       BOOL bLoadXml = false;    
  3.       CMarkup xml;    
  4.       bLoadXml = xml.Load("UserInfo.xml");    
  5.       if (bLoadXml)    
  6.       {    
  7.               xml.ResetMainPos();    
  8.               xml.FindElem();    
  9.               xml.IntoElem();    
  10.               xml.AddElem("UserID","luoluo");    
  11.               xml.OutOfElem();    
  12.               xml.Save("UserInfo.xml");    
  13.       }    
  14. //--------原来为------    
  15. <?xml version="1.0" encoding="UTF-8" ?>    
  16. <UserInfo>    
  17.   <UserID>luo</UserID>    
  18.   <UserID>lin</UserID>    
  19.   </UserInfo>    
  20. //---------添加后为-------------    
  21. <?xml version="1.0" encoding="UTF-8" ?>    
  22. <UserInfo>    
  23.   <UserID>luo</UserID>    
  24.   <UserID>lin</UserID>    
  25.   <UserID>luoluo</UserID>    
  26.   </UserInfo>   

//加在最后面 BOOL bLoadXml = false; CMarkup xml; bLoadXml = xml.Load("UserInfo.xml"); if (bLoadXml) { xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); xml.AddElem("UserID","luoluo"); xml.OutOfElem(); xml.Save("UserInfo.xml"); } //--------原来为------ <?xml version="1.0" encoding="UTF-8" ?> <UserInfo> <UserID>luo</UserID> <UserID>lin</UserID> </UserInfo> //---------添加后为------------- <?xml version="1.0" encoding="UTF-8" ?> <UserInfo> <UserID>luo</UserID> <UserID>lin</UserID> <UserID>luoluo</UserID> </UserInfo>

 

4.2  加在最前面(使用InsertElem)

 

  1. BOOL bLoadXml = false;    
  2. CMarkup xml;    
  3. bLoadXml = xml.Load("UserInfo.xml");    
  4. if (bLoadXml)    
  5. {    
  6.       xml.ResetMainPos();    
  7.       xml.FindElem();    
  8.       xml.IntoElem();    
  9.       xml.InsertElem("UserID","AddUserIDHead");    
  10.       xml.OutOfElem();    
  11.       xml.Save("UserInfo.xml");    
  12. }    
  13. //----原来为—    
  14. <?xml version="1.0" encoding="UTF-8" ?>    
  15. <UserInfo>    
  16.   <UserID>luo</UserID>    
  17.   <UserID>lin</UserID>    
  18.   </UserInfo>    
  19. //------修改后-----    
  20. <?xml version="1.0" encoding="UTF-8" ?>    
  21. <UserInfo>    
  22.   <UserID>AddUserIDHead</UserID>    
  23.   <UserID>luo</UserID>    
  24.   <UserID>lin</UserID>    
  25.   </UserInfo>   

BOOL bLoadXml = false; CMarkup xml; bLoadXml = xml.Load("UserInfo.xml"); if (bLoadXml) { xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); xml.InsertElem("UserID","AddUserIDHead"); xml.OutOfElem(); xml.Save("UserInfo.xml"); } //----原来为— <?xml version="1.0" encoding="UTF-8" ?> <UserInfo> <UserID>luo</UserID> <UserID>lin</UserID> </UserInfo> //------修改后----- <?xml version="1.0" encoding="UTF-8" ?> <UserInfo> <UserID>AddUserIDHead</UserID> <UserID>luo</UserID> <UserID>lin</UserID> </UserInfo>

 

5. 删除

 

  1. CMarkup xml;    
  2. xml.Load("UserInfo.xml");    
  3. BOOL bFind = true;    
  4. xml.ResetMainPos();         
  5. while (bFind)    
  6. {    
  7.       bFind = xml.FindChildElem("UserID");    
  8.       if (bFind)    
  9.       {    
  10.               //此时接点还是父接点    
  11.               CString strData = _T("");    
  12.               strData = xml.GetChildData();    
  13.               if (strData=="luo")    
  14.               {    
  15.                     xml.RemoveChildElem();    
  16.                     xml.Save("UserInfo.xml");    
  17.                     break;    
  18.               }    
  19.       }    
  20. }   

CMarkup xml; xml.Load("UserInfo.xml"); BOOL bFind = true; xml.ResetMainPos(); while (bFind) { bFind = xml.FindChildElem("UserID"); if (bFind) { //此时接点还是父接点 CString strData = _T(""); strData = xml.GetChildData(); if (strData=="luo") { xml.RemoveChildElem(); xml.Save("UserInfo.xml"); break; } } }

 

6. 查找

见第二点浏览。类似上面的例子里面没有属性这些东西,下面的一个例子是有属性的

 

  1. //UserInfo1.xml    
  2. <?xml version="1.0" encoding="UTF-8" ?>    
  3. <UserInfo>    
  4.   <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" />    
  5.   <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" />    
  6.   <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" />    
  7.   <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" />    
  8.   <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" />    
  9.   <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" />    
  10.   <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" />    
  11.   <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" />    
  12.   <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" />    
  13.   <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" />    
  14.   </UserInfo>   

//UserInfo1.xml <?xml version="1.0" encoding="UTF-8" ?> <UserInfo> <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" /> <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" /> <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" /> <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" /> <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" /> <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" /> <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" /> <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" /> <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" /> <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" /> </UserInfo>

 

7. 产生

 

  1. CString strID = _T("");    
  2.       CString strPwd = _T("");    
  3.       CMarkup xml;    
  4.       xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");    
  5.       xml.AddElem("UserInfo");    
  6.       xml.IntoElem();    
  7.       for (int i=0; i<10; i++)    
  8.       {    
  9.               //产生一个随机数,作为权限    
  10.               srand(UINT(time(NULL)+i));    
  11.               int nLevel = rand()%256;    
  12.               strID.Format("UserID%02d",i);    
  13.               strPwd.Format("UserPwd%02d",i);    
  14.               xml.AddElem("User");    
  15.               xml.AddAttrib("UserID",strID);    
  16.               xml.AddAttrib("UserPwd",strPwd);    
  17.               xml.AddAttrib("UserLevel",nLevel);    
  18.       }    
  19.       xml.OutOfElem();    
  20.       xml.Save("UserInfo1.xml");   

CString strID = _T(""); CString strPwd = _T(""); CMarkup xml; xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xml.AddElem("UserInfo"); xml.IntoElem(); for (int i=0; i<10; i++) { //产生一个随机数,作为权限 srand(UINT(time(NULL)+i)); int nLevel = rand()%256; strID.Format("UserID%02d",i); strPwd.Format("UserPwd%02d",i); xml.AddElem("User"); xml.AddAttrib("UserID",strID); xml.AddAttrib("UserPwd",strPwd); xml.AddAttrib("UserLevel",nLevel); } xml.OutOfElem(); xml.Save("UserInfo1.xml");

 

8. 查找

 

  1. CMarkup xml;    
  2. BOOL bLoad = false;    
  3. BOOL bFind = false;    
  4. bLoad = xml.Load("UserInfo1.xml");    
  5.       if (bLoad)    
  6.       {    
  7.               CString strID;    
  8.               CString strPwd;    
  9.               xml.ResetMainPos();    
  10.               xml.FindElem();    //UserInfo    
  11.               while (xml.FindChildElem("User"))    
  12.               {    
  13.                     strID = xml.GetChildAttrib("UserID");    
  14.                     strPwd = xml.GetChildAttrib("UserPwd");    
  15.                     TRACE("\n----id:%s,pwd:%s-------\n",strID,strPwd);    
  16.                     if (strID=="UserID00"&&strPwd=="UserPwd00")    
  17.                     {    
  18.                             bFind = true;    
  19.                             break;    
  20.                     }    
  21.               }    
  22.       }    
  23.       if (bFind)    
  24.       {    
  25.               TRACE("\n---- find------\n");    
  26.       }    
  27.       else    
  28.       {    
  29.               TRACE("\n----no find------\n");    
  30.       }   

CMarkup xml; BOOL bLoad = false; BOOL bFind = false; bLoad = xml.Load("UserInfo1.xml"); if (bLoad) { CString strID; CString strPwd; xml.ResetMainPos(); xml.FindElem(); //UserInfo while (xml.FindChildElem("User")) { strID = xml.GetChildAttrib("UserID"); strPwd = xml.GetChildAttrib("UserPwd"); TRACE("\n----id:%s,pwd:%s-------\n",strID,strPwd); if (strID=="UserID00"&&strPwd=="UserPwd00") { bFind = true; break; } } } if (bFind) { TRACE("\n---- find------\n"); } else { TRACE("\n----no find------\n"); }

 

9. 修改

 

  1. CMarkup xml;    
  2.       BOOL bLoad = false;    
  3.       BOOL bFind = false;    
  4.       bLoad = xml.Load("UserInfo1.xml");    
  5.       if (bLoad)    
  6.       {    
  7.               CString strID;    
  8.               CString strPwd;    
  9.               xml.ResetMainPos();    
  10.               xml.FindElem();    //UserInfo    
  11.               while (xml.FindChildElem("User"))    
  12.               {    
  13.                     strID = xml.GetChildAttrib("UserID");    
  14.                     strPwd = xml.GetChildAttrib("UserPwd");    
  15.                     TRACE("\n----id:%s,pwd:%s-------\n",strID,strPwd);    
  16.                     if (strID=="UserID00"&&strPwd=="UserPwd00")    
  17.                     {    
  18.                             bFind = true;    
  19.                             xml.SetChildAttrib("UserID",strID+CString("Modify"));    
  20.                             xml.Save("UserInfo1.xml");    
  21.                             break;    
  22.                     }    
  23.               }    
  24.       }    
  25.       if (bFind)    
  26.       {    
  27.               TRACE("\n---- find------\n");    
  28.       }    
  29.       else    
  30.       {    
  31.               TRACE("\n----no find------\n");    
  32.       }   





 

<?xml version="1.0"?>

 

<BitComet Author="RnySmile" Version="0.1">

      <Settings>

              <LastSaveLocation>E:\电子书</LastSaveLocation>

              <ListenPort>8497</ListenPort>

              <GlobalMaxUploadRate>3072</GlobalMaxUploadRate>

              <LastAdCacheClearDate>13104</LastAdCacheClearDate>

              <LastTrackerKey>16547</LastTrackerKey>

              <TotalUpload>303008</TotalUpload>

              <TotalDownload>1180107</TotalDownload>

              <LastExitTime>1132203124</LastExitTime>

      </Settings>

</BitComet>

代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include "stdafx.h" 

#include 
<iostream> 

using namespace std; 

#include 
<msxml.h> 

#include 
<atlstr.h> 

#import 
"msxml.dll" raw_interfaces_only 

int _tmain(int argc, _TCHAR* argv[]) 



    ::CoInitialize(NULL); 

    CComPtr
<MSXML::IXMLDOMDocument> spDoc; 

    HRESULT hr 
= spDoc.CoCreateInstance(__uuidof(MSXML::DOMDocument));    //创建文档对象 

    VARIANT_BOOL bFlag; 

    hr 
= spDoc->load(CComVariant(L"BitComet.xml"), &bFlag);              //load xml文件 

    CComPtr
<MSXML::IXMLDOMElement> spElement; 

    hr 
= spDoc->get_documentElement(&spElement);  //获取根结点 

    CComBSTR strTagName; 

    hr 
= spElement->get_tagName(&strTagName); 

    cout 
<< "------TagName------" << endl; 

    cout 
<< CString(strTagName) << endl; 

    CComPtr
<MSXML::IXMLDOMNodeList> spNodeList; 

    hr 
= spElement->get_childNodes(&spNodeList);  //获取子结点列表 

    
long lCount;                                      

    hr 
= spNodeList->get_length(&lCount); 

    
for (long i=0; i<lCount; ++i) 

    { 

        CComVariant varNodeValue; 

        CComPtr
<MSXML::IXMLDOMNode> spNode; 

        MSXML::DOMNodeType NodeType; 

        CComPtr
<MSXML::IXMLDOMNodeList> spChildNodeList; 

        hr 
= spNodeList->get_item(i, &spNode);        //获取结点 

        hr 
= spNode->get_nodeType(&NodeType);    //获取结点信息的类型 

        
if (NODE_ELEMENT == NodeType) 

        { 

              hr 
= spNode->get_childNodes(&spChildNodeList); 

              
long childLen; 

              hr 
= spChildNodeList->get_length(&childLen); 

              cout 
<< "------NodeList------" << endl; 

              
for (int j=0; j<childLen; ++j) 

              { 

                  CComPtr
<MSXML::IXMLDOMNode> spChildNode; 

                  CComBSTR value; 

                  hr 
= spChildNodeList->get_item(j, &spChildNode); 

                  hr 
= spChildNode->get_nodeName(&value);            //获取结点名字 

                  cout 
<< CString(value) << endl; 

                  hr 
= spChildNode->get_text(&value);                //获取结点的值 

                  cout 
<< CString(value) << endl << endl; 

                  spChildNode.Release(); 

              } 

        } 

        spNode.Release(); 

        spChildNodeList.Release(); 

    } 

    spNodeList.Release(); 

    spElement.Release(); 

    spDoc.Release(); 

    ::CoUninitialize(); 

    
return 0

}

 

VC使用MSXML解析XML文档


第一部分:DOM解析:


      概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。

 

    1、如何加载xml文件:

         //创建DOM,加载XML文档
         MSXML::IXMLDOMDocumentPtr pCommandDoc;
         pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
          pCommandDoc->put_async(VARIANT_FALSE);
          pCommandDoc->put_validateOnParse(VARIANT_FALSE);
          pCommandDoc->put_resolveExternals(VARIANT_FALSE);
          pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
          pCommandDoc->load(file.GetBuffer(0));

     2、在XML文档中查找指定的结点:

      //找到
     MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
       if (pRootNode==NULL)
     {
          return ;
      }

    3、得到XML文档中,结点的属性

        CString strTemp;
     MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
     pRootNode->get_attributes(&pAttrs);
     if (pAttrs==NULL)
     {
          return;
     }
     MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
     _bstr_t strRequestType=pRequestTypeAttr->Gettext();
     strTemp=strRequestType.operator char *();

    4、得到结点的内容

    _bstr_t strVisiPort=pNode->Gettext();

    5、设置结点的内容

     HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));


   6、设置一个属性内容
    IXMLDOMAttribute *pa=NULL;
    bstr = SysAllocString(L"属性1");
    pXMLDom->createAttribute(bstr,&pNode);
    var = VariantString(L"strin");
    pa->put_value(var);
    pRoot->setAttributeNode(pa, &pa1);
  

第二部分、如何使用SAX解析

        概述:SAX使用的是加载式的,将会把XML文档分断,加载到内存中。使用事件通知的方式,来表示找到结点。好像没有写文档的能力吧。它的速度要比DOM快不少。

       使用SAX的时候,就需要重载MSXML4.0中的一个接口ISAXContentHandler。

      有几个函数重载了之后,当找到了结点之后,就会回调这一些函数。
  

对于这一种SAX解析的模式有一些不太了解如何应用。只是感觉这种方式可能不太好用于那种

对结构很重要的xml文档的解析。

 

 

转载于:https://www.cnblogs.com/ciey/archive/2009/08/05/1539760.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值