zoukankan      html  css  js  c++  java
  • 转载 VC轻松解析XML文件

    VC轻松解析XML文件 - CMarkup类的使用方法
    http://www.cctry.com/thread-3866-1-1.html

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

    1. //----------UserInfo.xml--------------    
    2. xml version="1.0" encoding="UTF-8" ?>     
    3. <UserInfo>    
    4.   <UserID>luo</UserID>     
    5.   <UserID>lin</UserID>     
    6.   </UserInfo>   
    7. //----------UserInfo.xml--------------
    8. xml version="1.0" encoding="UTF-8" ?> 
    9. <UserInfo>
    10. <UserID>luo</UserID> 
    11. <UserID>lin</UserID> 
    12. </UserInfo>
    复制代码

    1. 生成UserInfo.xml

    1. CMarkup xml;     
    2. xml.SetDoc("xml version="1.0" encoding="UTF-8"?> ");     
    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");    
    9. CMarkup xml; 
    10. xml.SetDoc("xml version="1.0" encoding="UTF-8"?> "); 
    11. xml.AddElem("UserInfo"); 
    12. xml.IntoElem(); 
    13. xml.AddElem("UserID","luo"); 
    14. xml.AddElem("UserID","lin"); 
    15. xml.OutOfElem(); 
    16. xml.Save("UserInfo.xml");
    复制代码

    2. 浏览特定元素
    //----查看所有UserID----

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

    //-------------结果----------     
    ---tagName:UserID,Data:luo--     
    ---tagName:UserID,Data:lin—    

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

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

    //-------------结果---------- 
    ---tagName:UserID,Data:luo-- 
    ---tagName:UserID,Data:lin—

    3. 修改

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

    1. BOOL bLoadXml = false;     
    2. CMarkup xml;     
    3. bLoadXml = xml.Load("UserInfo.xml");     
    4.       if (bLoadXml)     
    5.       {     
    6.               CString strUserID = _T("");     
    7.               xml.ResetMainPos();     
    8.               xml.FindElem();     
    9.               xml.IntoElem();     
    10.               while (xml.FindElem("UserID"))     
    11.               {     
    12.                     strUserID = xml.GetData();     
    13.                     if (strUserID=="luo")     
    14.                     {     
    15.                             xml.SetData(CString("flypig")+strUserID);     
    16.                             xml.Save("UserInfo.xml");     
    17.                             break;     
    18.                     }     
    19.               }     
    20.       }    
    21. //--------把UserID为”luo”改为”flypigluo”----------- 
    22. BOOL bLoadXml = false; 
    23. CMarkup xml; 
    24. bLoadXml = xml.Load("UserInfo.xml"); 
    25.       if (bLoadXml) 
    26.       { 
    27.               CString strUserID = _T(""); 
    28.               xml.ResetMainPos(); 
    29.               xml.FindElem(); 
    30.               xml.IntoElem(); 
    31.               while (xml.FindElem("UserID")) 
    32.               { 
    33.                     strUserID = xml.GetData(); 
    34.                     if (strUserID=="luo") 
    35.                     { 
    36.                             xml.SetData(CString("flypig")+strUserID); 
    37.                             xml.Save("UserInfo.xml"); 
    38.                             break; 
    39.                     } 
    40.               } 
    41.       }
    复制代码

    4. 添加

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

    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.AddElem("UserID","luoluo");     
    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>luo</UserID>     
    23.   <UserID>lin</UserID>     
    24.   <UserID>luoluo</UserID>     
    25.   </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>    
    26. BOOL bLoadXml = false; 
    27. CMarkup xml; 
    28. bLoadXml = xml.Load("UserInfo.xml"); 
    29. if (bLoadXml) 
    30.       xml.ResetMainPos(); 
    31.       xml.FindElem(); 
    32.       xml.IntoElem(); 
    33.       xml.InsertElem("UserID","AddUserIDHead"); 
    34.       xml.OutOfElem(); 
    35.       xml.Save("UserInfo.xml"); 
    36. //----原来为— 
    37. xml version="1.0" encoding="UTF-8" ?> 
    38. <UserInfo> 
    39.   <UserID>luo</UserID> 
    40.   <UserID>lin</UserID> 
    41.   </UserInfo> 
    42. //------修改后----- 
    43. xml version="1.0" encoding="UTF-8" ?> 
    44. <UserInfo> 
    45.   <UserID>AddUserIDHead</UserID> 
    46.   <UserID>luo</UserID> 
    47.   <UserID>lin</UserID> 
    48.   </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. }    
    21. CMarkup xml; 
    22. xml.Load("UserInfo.xml"); 
    23. BOOL bFind = true; 
    24. xml.ResetMainPos();      
    25. while (bFind) 
    26.       bFind = xml.FindChildElem("UserID"); 
    27.       if (bFind) 
    28.       { 
    29.               //此时接点还是父接点 
    30.               CString strData = _T(""); 
    31.               strData = xml.GetChildData(); 
    32.               if (strData=="luo") 
    33.               { 
    34.                     xml.RemoveChildElem(); 
    35.                     xml.Save("UserInfo.xml"); 
    36.                     break; 
    37.               } 
    38.       } 
    39. }
    复制代码

    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>    
    15. //UserInfo1.xml 
    16. xml version="1.0" encoding="UTF-8" ?> 
    17. <UserInfo> 
    18.   <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" /> 
    19.   <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" /> 
    20.   <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" /> 
    21.   <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" /> 
    22.   <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" /> 
    23.   <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" /> 
    24.   <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" /> 
    25.   <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" /> 
    26.   <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" /> 
    27.   <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" /> 
    28.   </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");    
    21. CString strID = _T(""); 
    22.       CString strPwd = _T(""); 
    23.       CMarkup xml; 
    24.       xml.SetDoc("xml version="1.0" encoding="UTF-8"?>"); 
    25.       xml.AddElem("UserInfo"); 
    26.       xml.IntoElem(); 
    27.       for (int i=0; i<10; i++) 
    28.       { 
    29.               //产生一个随机数,作为权限 
    30.               srand(UINT(time(NULL)+i)); 
    31.               int nLevel = rand()%256; 
    32.               strID.Format("UserID%02d",i); 
    33.               strPwd.Format("UserPwd%02d",i); 
    34.               xml.AddElem("User"); 
    35.               xml.AddAttrib("UserID",strID); 
    36.               xml.AddAttrib("UserPwd",strPwd); 
    37.               xml.AddAttrib("UserLevel",nLevel); 
    38.       } 
    39.       xml.OutOfElem(); 
    40.       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(" ----id:%s,pwd:%s------- ",strID,strPwd);     
    16.                     if (strID=="UserID00"&&strPwd=="UserPwd00")     
    17.                     {     
    18.                             bFind = true;     
    19.                             break;     
    20.                     }     
    21.               }     
    22.       }     
    23.       if (bFind)     
    24.       {     
    25.               TRACE(" ---- find------ ");     
    26.       }     
    27.       else     
    28.       {     
    29.               TRACE(" ----no find------ ");     
    30.       }    
    31. CMarkup xml; 
    32. BOOL bLoad = false; 
    33. BOOL bFind = false; 
    34. bLoad = xml.Load("UserInfo1.xml"); 
    35.       if (bLoad) 
    36.       { 
    37.               CString strID; 
    38.               CString strPwd; 
    39.               xml.ResetMainPos(); 
    40.               xml.FindElem();    //UserInfo 
    41.               while (xml.FindChildElem("User")) 
    42.               { 
    43.                     strID = xml.GetChildAttrib("UserID"); 
    44.                     strPwd = xml.GetChildAttrib("UserPwd"); 
    45.                     TRACE(" ----id:%s,pwd:%s------- ",strID,strPwd); 
    46.                     if (strID=="UserID00"&&strPwd=="UserPwd00") 
    47.                     { 
    48.                             bFind = true; 
    49.                             break; 
    50.                     } 
    51.               } 
    52.       } 
    53.       if (bFind) 
    54.       { 
    55.               TRACE(" ---- find------ "); 
    56.       } 
    57.       else 
    58.       { 
    59.               TRACE(" ----no find------ "); 
    60.       }
    复制代码

    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(" ----id:%s,pwd:%s------- ",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(" ---- find------ ");     
    28.       }     
    29.       else     
    30.       {     
    31.               TRACE(" ----no find------ ");     
    32.       }   
    复制代码

    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等拷贝函数可以修正。

  • 相关阅读:
    USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)
    USACO 3.2.6 Sweet Butter 香甜的黄油(最短路)
    USACO 1.3.4 Prime Cryptarithm 牛式(模拟枚举)
    USACO 1.3.3 Calf Flac(Manacher算法)
    USACO 1.2.2 Transformations 方块转换
    小希的迷宫(并查集判环)
    Is It A Tree?(并查集)
    Manacher算法——求最长回文子串
    Live Love(思维)
    Longge's problem(欧拉函数应用)
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8544095.html
Copyright © 2011-2022 走看看