• 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");   

    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—   

    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.       }   

    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>   

    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>   

    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. }   

    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>   

    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");   

    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.       }   

    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>

    代码如下:

    Code

    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文档的解析。

  • 相关阅读:
    [译]理解 iOS 异常类型 <🌟>
    LeetCode 24. 两两交换链表中的节点
    解决The operation couldn’t be completed. Unable to log in with account
    <Typora> 常用操作快捷键
    LeetCode 23. 合并K个升序链表
    CSS盒子模型
    CCS属性
    CSS
    form表单
    html
  • 原文地址:https://www.cnblogs.com/ciey/p/1539760.html
Copyright © 2020-2023  润新知