使用MSXML读写XML文件

源代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <cassert>
  4. #include <tchar.h>
  5. using namespace std;
  6. #import <msxml4.dll>
  7. using namespace MSXML2;
  8. BOOL CreateXmlFile(LPCTSTR lpszPath);
  9. BOOL QueryXmlFile(LPCTSTR lpszPath);
  10. const TCHAR szFile[] = _T("./smp.xml");
  11. int main()
  12. {
  13. //初始化COM库
  14. ::CoInitialize(NULL);
  15. if (!CreateXmlFile(szFile))
  16. {
  17. cout << "create xml file failed..." << endl;
  18. return 0;
  19. }
  20. MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  21. HRESULT hr = NULL;
  22. hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  23. if (FAILED(hr))
  24. {
  25. cout << "failed to instantiate DOMDocument40 class" << endl;
  26. return 0;
  27. }
  28. if (VARIANT_TRUE != pDoc->load(szFile))
  29. {
  30. cout << "failed load xml data from file: " << static_cast<char*>(pDoc->parseError->Getreason()) << endl;
  31. return 0;
  32. }
  33. cout << static_cast<char*>(pDoc->xml) << endl;
  34. pDoc.Release();
  35. cout << "---------------------------------------------" << endl;
  36. cout <<  "start query..." << endl;
  37. QueryXmlFile(szFile);
  38. //反初始化COM库
  39. ::CoUninitialize();
  40. return 1;
  41. }
  42. ///
  43. // 创建Xml样例文件
  44. // lpszPath: xml文件的保存路径
  45. // return: 创建成功返回TRUE,否则返回FALSE
  46. ///
  47. BOOL CreateXmlFile(LPCTSTR lpszPath)
  48. {
  49. BOOL bRet = FALSE;
  50. HRESULT hr = S_FALSE;
  51. MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  52. MSXML2::IXMLDOMElementPtr pParent = NULL;
  53. MSXML2::IXMLDOMElementPtr pChild = NULL;
  54. MSXML2::IXMLDOMProcessingInstructionPtr pPi;
  55. do
  56. {
  57. hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  58. if (FAILED(hr))
  59. {
  60. break;
  61. }
  62. pDoc->preserveWhiteSpace = VARIANT_TRUE;// 提供对white space node的支持
  63. //创建文件头
  64. pPi = pDoc->createProcessingInstruction("xml", "version=/"1.0/" encoding=/"utf-8/"");
  65. if (NULL == pPi)
  66. {
  67. break;
  68. }
  69. pDoc->appendChild(pPi);
  70. //创建注释
  71. MSXML2::IXMLDOMCommentPtr pComt = NULL;
  72. pComt = pDoc->createComment("Sample xml file create using xml dom object");
  73. if (NULL == pComt)
  74. {
  75. break;
  76. }
  77. pDoc->appendChild(pComt);
  78. //header
  79. pParent = pDoc->createElement("request");
  80. pDoc->appendChild(pParent);
  81. pParent->appendChild(pDoc->createTextNode("/n/t"));
  82. pChild = pDoc->createElement("username");
  83. pChild->text = "andylin";
  84. pParent->appendChild(pChild);
  85. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  86. pChild = pDoc->createElement("password");
  87. pChild->text = "pwd";
  88. pParent->appendChild(pChild);
  89. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  90. //  pParent = pDoc->documentElement;
  91. pParent->appendChild(pDoc->createTextNode("/n/n/t"));
  92. //commands
  93. pChild = pDoc->createElement("cmdlines");
  94. MSXML2::IXMLDOMAttributePtr pAttr = NULL;
  95. pAttr = pDoc->createAttribute("count");
  96. pAttr->value = "2";
  97. pChild->setAttributeNode(pAttr);
  98. pAttr = pDoc->createAttribute("reply");
  99. pAttr->text = "no";
  100. pChild->setAttributeNode(pAttr);
  101. pChild->setAttribute("immediate", "yes");
  102. pAttr.Release();
  103. pParent->appendChild(pChild);
  104. pParent = pChild;
  105. //one group command
  106. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  107. pChild = pDoc->createElement("cmd");
  108. pChild->setAttribute("num", "1");
  109. pParent->appendChild(pChild);
  110. pParent = pChild;
  111. pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  112. pChild = pDoc->createElement("type");
  113. pChild->text = "backup";
  114. pParent->appendChild(pChild);
  115. pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  116. pChild = pDoc->createElement("dbname");
  117. pChild->text = "db14663";
  118. pParent->appendChild(pChild);
  119. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  120. pParent = pParent->parentNode;
  121. //another group command
  122. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  123. pChild = pDoc->createElement("cmd");
  124. pChild->setAttribute("num", "2");
  125. pParent->appendChild(pChild);
  126. pParent = pChild;
  127. pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  128. pChild = pDoc->createElement("type");
  129. pChild->text = "save";
  130. pParent->appendChild(pChild);
  131. pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  132. pChild = pDoc->createElement("data");
  133. //craet cdata
  134. MSXML2::IXMLDOMCDATASectionPtr pSec = NULL;
  135. pSec = pDoc->createCDATASection("这里是XML文档的CDATA数据段...");
  136. pChild->appendChild(pSec);
  137. pSec.Release();
  138. pParent->appendChild(pChild);
  139. pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  140. pParent = pParent->parentNode;
  141. pParent->appendChild(pDoc->createTextNode("/n/t"));
  142. pParent = pParent->parentNode;
  143. pParent->appendChild(pDoc->createTextNode("/n"));
  144. pDoc->save(lpszPath);
  145. } while (0);
  146. if (pDoc)
  147. {
  148. pDoc.Release();
  149. pDoc = NULL;
  150. }
  151. if (pParent)
  152. {
  153. pParent.Release();
  154. pParent = NULL;
  155. }
  156. if (pChild)
  157. {
  158. pChild.Release();
  159. pChild = NULL;
  160. }
  161. return TRUE;
  162. }
  163. ///
  164. // 分析Xml样例文件
  165. // lpszPath: xml文件的路径
  166. // return: 分析成功返回TRUE,否则返回FALSE
  167. ///
  168. BOOL QueryXmlFile(LPCTSTR lpszPath)
  169. {
  170. BOOL bRet = FALSE;
  171. HRESULT hr = S_FALSE;
  172. MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  173. MSXML2::IXMLDOMNodePtr pNode = NULL;
  174. do
  175. {
  176. hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  177. if (FAILED(hr))
  178. {
  179. break;
  180. }
  181. pDoc->async = VARIANT_FALSE;
  182. if (VARIANT_TRUE != pDoc->load(lpszPath))
  183. {
  184. break;
  185. }
  186. pNode = pDoc->selectSingleNode("/request/username");
  187. cout << "user name = " << static_cast<char*>(pNode->text) << endl;
  188. pNode = pDoc->selectSingleNode("/request/password");
  189. cout << "password = " << static_cast<char*>(pNode->text) << endl;
  190. pNode = pDoc->selectSingleNode("/request/cmdlines");
  191. MSXML2::IXMLDOMNamedNodeMapPtr pmapName = NULL;
  192. pmapName = pNode->attributes;
  193. pNode = pmapName->getNamedItem("count");
  194. cout << "count = " << static_cast<char*>(pNode->text) << endl;
  195. pNode = pmapName->getNamedItem("reply");
  196. cout << "reply = " << static_cast<char*>(pNode->text) << endl;
  197. pNode = pmapName->getNamedItem("immediate");
  198. cout << "immediate = " << static_cast<char*>(pNode->text) << endl;
  199. MSXML2::IXMLDOMNodeListPtr plsNode = NULL;
  200. plsNode = pDoc->selectNodes("/request/cmdlines/cmd");
  201. assert(2 == plsNode->length);
  202. cout << "cmd group 1: " << endl;
  203. pNode = plsNode->item[0]->selectSingleNode("type");
  204. cout << "type = " << static_cast<char*>(pNode->text) << endl;
  205. pNode = plsNode->item[0]->selectSingleNode("dbname");
  206. cout << "dbname = " << static_cast<char*>(pNode->text) << endl;
  207. cout << "cmd group 2: " << endl;
  208. pNode = plsNode->item[1]->selectSingleNode("type");
  209. cout << "type = " << static_cast<char*>(pNode->text) << endl;
  210. pNode = plsNode->item[1]->selectSingleNode("data");
  211. cout << "data = " << static_cast<char*>(pNode->text) << endl;
  212. } while (0);
  213. if (pDoc)
  214. {
  215. pDoc.Release();
  216. pDoc = NULL;
  217. }
  218. if (pNode)
  219. {
  220. pNode.Release();
  221. pNode = NULL;
  222. }
  223. return TRUE;
  224. }

生成的XML文件:

  <?xml version="1.0" encoding="utf-8" ?>
- <!--

Sample xml file create using xml dom object

  --> <script>f(clean);</script>

- <request>
  <username>andylin</username>
  <password>pwd</password>
- <cmdlines count="2" reply="no" immediate="yes">
- <cmd num="1">
  <type>backup</type>
  <dbname>db14663</dbname>
  </cmd>

- <cmd num="2">
  <type>save</type>
- <data>
- <![CDATA[

这里是XML文档的CDATA数据段...

  ]]> <script>f(clean);</script>

  </data>

  </cmd>

  </cmdlines>

  </request>

运行结果:

<?xml version="1.0"?>
<!--Sample xml file create using xml dom object-->
<request>
        <username>andylin</username>
        <password>pwd</password>
        <cmdlines count="2" reply="no" immediate="yes">
                <cmd num="1">
                        <type>backup</type>
                        <dbname>db14663</dbname>
                </cmd>
                <cmd num="2">
                        <type>save</type>
                        <data><![CDATA[这里是XML文档的CDATA数据段...]]></data>
                </cmd>
        </cmdlines>
</request>

---------------------------------------------
start query...
user name = andylin
password = pwd
count = 2
reply = no
immediate = yes
cmd group 1:
type = backup
dbname = db14663
cmd group 2:
type = save
data = 这里是XML文档的CDATA数据段...
Press any key to continue

使用MSXML读写XML文件相关推荐

  1. dom4j读写xml文件

    dom4j读写xml文件 首先我们给出一段示例程序: import java.io.File; import java.io.FileWriter; import java.util.Iterator ...

  2. VC++ MSXML创建XML文件以及对XML文档解析

    VC++ MSXML创建XML文件以及对XML文档解析 转自http://www.newxing.com/Tech/Program/Cpp/703.html // XmlCreationDemo.cp ...

  3. [转]C#读写xml文件

    c#读写xml文件 已知有一个XML文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"? ...

  4. (3)[wp7数据存储] WP7 IsolatedStorage系列篇——通过XmlSerializer读写XML文件 [复制链接]...

    发表于 2012-5-17 15:51:07 |只看该作者 |倒序浏览 分享到: 本帖最后由 agameboy 于 2012-5-17 17:08 编辑 这一篇我们会通过XmlSerializer读写 ...

  5. xml文件c语言读取函数,读写xml文件的2个小函数

    #region 读写xml文件的2个小函数,2005 4 2 by hyc public void SetXmlFileValue(string xmlPath,string AppKey,strin ...

  6. java dom读写xml文件_java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 encoding="GB2312"?> "男"> 李华姓名> 14年龄> 学生> ...

  7. Unity(C#)读写xml文件详解

    目录 什么是xml文件? xml文件的结构 如何读写xml文件 什么是xml文件? xml文件是一种可拓展标记语言,由于简单易用,常被应用程序用于保存数据,unity也是如此,在我们需要控制读写用户的 ...

  8. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  9. [QT操作XML]QT读写XML文件,QT修改XML文件

    [QT操作XML]QT读写XML文件 XML简介 QT操作XML,写入.读取.修改 XML效果演示 XML简介 概念:Extensible Markup Language 可扩展标记语言(可扩展:标签 ...

最新文章

  1. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL,spring获取context...
  2. 可转债数据一览表集思录_学习先进的可转债投资策略
  3. 如何开发利用计算机字体,如何利用PS来制作水纹特效字体
  4. MVP 2008全球峰会可预订宾馆,寻室友
  5. 30可以刷什么系统_刷脸支付系统可以对接原来的收银系统吗?
  6. [css] 你有使用过font-size-adjust属性吗?说说它的作用是什么?
  7. mocha 测试 mysql_GitHub - zouzhenxing/lei: 整合Express mysql ioredis ejs 的一开发框架,使用mocha对api进行测试...
  8. java布尔类型的调用_【Java学习笔记之八】JavaBean中布尔类型使用注意事项
  9. eclipse中提示“java application configureation name i”
  10. MyBatis学习笔记(4)-resultMap多对多映射使用总结
  11. 全网首发:MAC上运行SHELL脚本,typeset -l报错
  12. linux7配置永久路由,CentOS7添加永久静态路由
  13. 概率论与数理统计常用公式大全
  14. 关于logo1_.exe(威金病毒)蠕虫病毒的清楚,
  15. 快速给网站加一个赞赏码功能
  16. iReasoning MIB Browser显示中文乱码问题
  17. python处理FITS 3:处理头文件和数据单元
  18. 合作式智能运输系统车路协同云控系统V2X设备接入技术规范
  19. 压缩文件并删除源文件
  20. vue 实现 markdown书写博客 showdown

热门文章

  1. 天下贰的朋友们进来看下!!
  2. Java高并发秒杀API(三)之Web层
  3. Java中String和char、int相互转换
  4. Devops学习实践(三) jenkins集成findbugs
  5. html移除属性 jquery,Jquery添加删除属性、添加类
  6. 做网红营销可以给企业品牌带来哪些价值?
  7. 海贼王热血航线服务器维护,航海王热血航线连接服务器失败?解决方法一览
  8. 图解面试题:如何找到喜欢的电影?
  9. 蓝屏代码:0x000000ED:UNMOUNTABLE_BOOT_VOLUME 的解决方案
  10. Docker镜像文件使C盘爆满