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. Raspberry Pi开发之旅-土壤湿度检测

    一.土壤传感器 传感器四个针脚:  针脚 含义 AO 模拟信号输出 DO 数字信号输出 GND 电源负极 VCC 电源正极 二.接线 YL-38和YL69 之间直接用2根母对母线连接. YL-38和树 ...

  2. 【Flask】Flask-Sqlalchemy使用笔记

    ### 安装:```shellpip install flask-sqlalchemy``` ### 数据库连接:1. 跟sqlalchemy一样,定义好数据库连接字符串DB_URI.2. 将这个定义 ...

  3. gem Errno::ECONNRESET: Connection reset by peer - SSL_connect

    问题描述 在使用gem安装软件包时,会时常遇到下面的问题: ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) Errno: ...

  4. Go 语言基础知识

    0. Go语言书单 1. 文本注释 // 单行注释 /* */ 多行注释 2. 变量赋值 = 变量赋值 := 声明变量并赋值 3. 变量定义 var name string var age int v ...

  5. RSA签名 python PHP demo 例子

    python RSA+MD5签名demo: #!/usr/bin/env python2.7 #coding:utf-8 import base64 from Crypto.PublicKey imp ...

  6. 日志-logback

    参考:http://www.importnew.com/22290.html 一 概述 1.1 LogBack.Slf4j和Log4j之间的关系 1)Slf4j(The Simple Logging ...

  7. python练习_sed替换

    python练习_sed替换 需求: 做一个sed替换小程序,实现在windows下可以与实现linux中sed替换的功能 支持正则(re模块) 以下代码实现的功能与思路: 功能: (1)支持文件内容 ...

  8. 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

    1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...

  9. LAMP环境搭建问题

    //////////////////////////LAMP环境搭建问题///////////////////////////////////////LAMP常见的问题A.安装相关问题(1)MySQL ...

  10. 添加语句<tx:annotation-driven transaction-manager="txManager"/>报错

    在添加<tx:annotation-driven transaction-manager="txManager"/>程序之前,applicationContext.xm ...