VC解析XML文件-CMarkup


VC解析XML文件的工具有很多,CMarkup, tinyXML,還有IBM的,MS的等等。
據說tinyXML很好,可能字符集問題,我編譯不了。
所以就用CMarkup來解析,使用過后,覺得非常不錯,使用起來很方便。
CMarkup類下載地址:http://download.csdn.net/detail/zahxz/7291845

CMarkup示例下載地址:http://download.csdn.net/detail/zahxz/7291901
發現網上有方法很法,我就摘下來了

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

 

 

1. 生成UserInfo.xml

  1. 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");    
    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. 瀏覽特定元素
//----查看所有UserID----

  1. 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—   

//----查看所有UserID----

  1. 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. 修改

//--------把UserID為”luo”改為”flypigluo”-----------

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

     


4. 添加

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

  1. 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)
    
    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>

     

 

5. 刪除

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

     


6. 查找
見第二點瀏覽。類似上面的例子里面沒有屬性這些東西,下面的一個例子是有屬性的

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

     


7. 產生

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

     


8. 查找

  1. 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");     
          }    
    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;     
          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;     
                                xml.SetChildAttrib("UserID",strID+CString("Modify"));     
                                xml.Save("UserInfo1.xml");     
                                break;     
                        }     
                  }     
          }     
          if (bFind)     
          {     
                  TRACE("\n---- find------\n");     
          }     
          else     
          {     
                  TRACE("\n----no find------\n");     
          }   

     


CMarkup字符集問題
daubwu posted @ 2008年9月08日 00:54 in VC with tags XML CMarkup , 38 閱讀
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等拷貝函數可以修正。

CMarkup類下載地址:http://download.csdn.net/detail/zahxz/7291845

CMarkup示例下載地址:http://download.csdn.net/detail/zahxz/7291901


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM