zoukankan      html  css  js  c++  java
  • 转:VC解析XML文件-CMarkup的使用详解

    本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下

    VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。
    据说tinyXML很好,可能字符集问题,我编译不了。
    所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。
    CMarkup下载地址:http://www.firstobject.com/
    发现网上有方法很法,我就摘下来了

    复制代码 代码如下:


    //----------UserInfo.xml--------------   
    xml version="1.0" encoding="UTF-8" ?>    
    <UserInfo>   
      <UserID>luo</UserID>    
      <UserID>lin</UserID>    
      </UserInfo>  
    //----------UserInfo.xml--------------
    xml version="1.0" encoding="UTF-8" ?>
    <UserInfo>
    <UserID>luo</UserID>
    <UserID>lin</UserID>
    </UserInfo>


    一、生成UserInfo.xml

    复制代码 代码如下:


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


    二、浏览特定元素

    复制代码 代码如下:


    //----查看所有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(" ---tagName:%s,Data:%s-- ",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(" ---tagName:%s,Data:%s-- ",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(" ---tagName:%s,Data:%s-- ",strTagName,strData);   
          }   
          */    

    复制代码 代码如下:


    //-------------结果----------    
    ---tagName:UserID,Data:luo--    
    ---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(" ---tagName:%s,Data:%s-- ",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(" ---tagName:%s,Data:%s-- ",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(" ---tagName:%s,Data:%s-- ",strTagName,strData);
          }
          */
    //-------------结果----------
    ---tagName:UserID,Data:luo--
    ---tagName:UserID,Data:lin—


    三、修改

    复制代码 代码如下:


    //--------把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;    
                        }    
                  }    
          }   
    //--------把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;
                        }
                  }
          }


    四、添加
    1  添在最后面(使用的是AddElem)

    复制代码 代码如下:


    //加在最后面
    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>


    2  加在最前面(使用InsertElem)

    复制代码 代码如下:


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


    五、删除

    复制代码 代码如下:


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


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

    复制代码 代码如下:


    //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>   
    //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>


    七、产生

    复制代码 代码如下:


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


    八、查找

    复制代码 代码如下:


    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(" ----id:%s,pwd:%s------- ",strID,strPwd);    
                        if (strID=="UserID00"&&strPwd=="UserPwd00")    
                        {    
                                bFind = true;    
                                break;    
                        }    
                  }    
          }    
          if (bFind)    
          {    
                  TRACE(" ---- find------ ");    
          }    
          else    
          {    
                  TRACE(" ----no find------ ");    
          }   
    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(" ----id:%s,pwd:%s------- ",strID,strPwd);
                        if (strID=="UserID00"&&strPwd=="UserPwd00")
                        {
                                bFind = true;
                                break;
                        }
                  }
          }
          if (bFind)
          {
                  TRACE(" ---- find------ ");
          }
          else
          {
                  TRACE(" ----no find------ ");
          }


    九、修改

    复制代码 代码如下:


    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(" ----id:%s,pwd:%s------- ",strID,strPwd);    
                        if (strID=="UserID00"&&strPwd=="UserPwd00")    
                        {    
                                bFind = true;    
                                xml.SetChildAttrib("UserID",strID+CString("Modify"));    
                                xml.Save("UserInfo1.xml");    
                                break;    
                        }    
                  }    
          }    
          if (bFind)    
          {    
                  TRACE(" ---- find------ ");    
          }    
          else    
          {    
                  TRACE(" ----no find------ ");    
          }   


    CMarkup字符集问题
    CMarkup支持Unicode,_MBCS宏定义。VS默认设置为MBCS宏定义,未设置该宏时为UTF-8编码。
    有 MBCS宏定义,且 打开的文件是UTF-8编码:
    CMarkup在Load时将UTF-8转换ANSI编码格式,所以要在读取的地方设置
    #include <locale.h>
    setlocale(LC_ALL, "");
    没有MBCS宏定义,且打开的文件是UTF-8编码:
    系统默认将文件按UTF-8格式读入系统中,所以显示的时候要手动将数据转换为ANSI格式的进行显示
    #include <locale.h>
    setlocale(LC_ALL, "");
    strVal = CMarkup::UTF8ToA(strVal);
    PS:通过strcpy等拷贝函数可以修正。

     

  • 相关阅读:
    ABAP-年月期间搜索帮助
    Others-Goldengate 数据同步
    ABAP-语音输出
    ABAP-ALV报表导出格式恢复初始画面
    ABAP-动态创建DATABASE/FUNCTION(风险)
    JDK 12 安装
    级数判敛--转自高教
    一文搞懂 JavaScript 中 DOM 相关的距离
    你应该知道的前端编程利器 VS Code
    js变量提升与函数提升的详细过程
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/4769243.html
Copyright © 2011-2022 走看看