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\"?>\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");
  9. CMarkup xml;
  10. xml.SetDoc("xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
  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("\n---tagName:%s,Data:%s--\n",strTagName,strData);
  13. }
  14. /********************这样也可以******************
  15. CMarkup xml;
  16. xml.Load("UserInfo.xml");
  17. BOOL bFind = true;
  18. xml.ResetMainPos();
  19. while (xml.FindChildElem("UserID");)
  20. {
  21. xml.IntoElem();
  22. CString strTagName = _T("");
  23. CString strData = _T("");
  24. strTagName = xml.GetTagName();
  25. strData = xml.GetData();
  26. TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);
  27. xml.OutOfElem();
  28. }*/
  29. /**************这样也可以**********************
  30. CMarkup xml;
  31. xml.Load("UserInfo.xml");
  32. BOOL bFind = true;
  33. xml.ResetMainPos();
  34. xml.FindElem();  //UserInfo
  35. xml.IntoElem();
  36. while (xml.FindElem("UserID");)
  37. {
  38. CString strTagName = _T("");
  39. CString strData = _T("");
  40. strTagName = xml.GetTagName();
  41. strData = xml.GetData();
  42. TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData);
  43. }
  44. */

复制代码

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

复制代码

//-------------结果---------- 
---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. {
  31. xml.ResetMainPos();
  32. xml.FindElem();
  33. xml.IntoElem();
  34. xml.InsertElem("UserID","AddUserIDHead");
  35. xml.OutOfElem();
  36. xml.Save("UserInfo.xml");
  37. }
  38. //----原来为—
  39. xml version="1.0" encoding="UTF-8" ?>
  40. <UserInfo>
  41. <UserID>luo</UserID>
  42. <UserID>lin</UserID>
  43. </UserInfo>
  44. //------修改后-----
  45. xml version="1.0" encoding="UTF-8" ?>
  46. <UserInfo>
  47. <UserID>AddUserIDHead</UserID>
  48. <UserID>luo</UserID>
  49. <UserID>lin</UserID>
  50. </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. {
  27. bFind = xml.FindChildElem("UserID");
  28. if (bFind)
  29. {
  30. //此时接点还是父接点
  31. CString strData = _T("");
  32. strData = xml.GetChildData();
  33. if (strData=="luo")
  34. {
  35. xml.RemoveChildElem();
  36. xml.Save("UserInfo.xml");
  37. break;
  38. }
  39. }
  40. }

复制代码

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("\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. }
  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("\n----id:%s,pwd:%s-------\n",strID,strPwd);
  46. if (strID=="UserID00"&&strPwd=="UserPwd00")
  47. {
  48. bFind = true;
  49. break;
  50. }
  51. }
  52. }
  53. if (bFind)
  54. {
  55. TRACE("\n---- find------\n");
  56. }
  57. else
  58. {
  59. TRACE("\n----no find------\n");
  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("\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. }

复制代码

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

转载 VC轻松解析XML文件 - CMarkup类的使用方法的更多相关文章

  1. 转:VC解析XML文件-CMarkup的使用详解

    本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下 VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等. 据说tinyX ...

  2. Android中的几种解析XML文件的类

    Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...

  3. Java解析XMl文件之SAX和DOm方法

    如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...

  4. Java中使用DOM4J来生成xml文件和解析xml文件

    一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...

  5. [转载] python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  6. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  7. cocos2d-x 显示中文字符和解析XML文件 转载

    源地址:http://codingnow.cn/cocos2d-x/1038.html 在cocos2d-x中直接显示中文的时候会出现乱码,虽然在实际开发中把字符串直接写在代码里也不是好的做法,但是有 ...

  8. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  9. Java进阶(二十七)使用Dom4j解析XML文件

    使用Dom4j解析XML文件 写在前面的话 由于论文实验要求,需要实现操作XML文档,为此想到了dom4j这个工具,使用之后深感受益.在此分享给大家,以此共勉. 注:本文转载自http://blog. ...

随机推荐

  1. Android L 64位兼容32 应用程序的认识

    http://blog.csdn.net/louyong0571/article/details/44223481 关于Android L 64位系统兼容32位应用的实现的简单分析. Android ...

  2. no xxx find in java.library.path

    JAVA系统运行时候load native lib时候会遇到下面错误,如 java.lang.UnsatisfiedLinkError: no JSTAF in java.library.path这可 ...

  3. Python绿色版

    Python 安装的时候,有个选项,是问你要安装给所有用户还是只安装给当前用户,你只要选择当前用户,就会把那些需要的 dll ,包括 msvcr90.dll 都给装到 Python 目录下,你只要把 ...

  4. Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行

    原文链接: http://www.cnblogs.com/zouzf/p/3985330.html 在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空 ...

  5. TypeScript手册1 - 基本类型和接口

    基本类型 像基本的JavaScript一样,TypeScript支持numbers, strings, structures, boolean等基本类型,而扩展的enum等类型,为编程提供了更多帮助. ...

  6. Ubuntu无法使用root用户登陆的解决办法

    对于一个新安装的Ubuntu操作系统,经常会遇到无法使用root用户ssh连接操作系统,比如说root用户的密码被拒绝等原因. 面对这种问题,介绍一下Ubuntu无法使用root登陆解决 1. 修改 ...

  7. iptables基础知识详解

    iptables防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙.如果你是第一 ...

  8. hadoop 伪分布模式环境搭建

    一 安装JDK 下载JDK      jdk-8u112-linux-i586.tar.gz 解压JDK     hadoop@ubuntu:/soft$ tar -zxvf jdk-8u112-li ...

  9. Ubuntu 16.04 安装 RabbitMQ

    Ubuntu 16.04 安装 RabbitMQ(注意,服务器安全组需要添加15672 和5672端口) #1 更新 $ sudo apt-get update$ sudo apt-get upgra ...

  10. JavaScript文件下载 兼容所有浏览器 不可跨域

    前端文件下载 兼容所有浏览器 download.js文件下载,几乎支持所有类型下载,详细内容参考官网 http://danml.com/download.html 引入文件 <script sr ...