使用tinyxml2库,git地址https://github.com/leethomason/tinyxml2

只需要使用tinyxml2.h tinyxml2.cpp即可,同时需要using namespace tinyxml2

这里给出从官方test提取出的一些常用的操作

  1. namespace XMLDemo {
  2.  
  3. static string fileNames[] = { "./resources/dream.xml",
  4. "./resources/utf8test.xml", "./resources/empty.xml",
  5. "./resources/utf8testverify.xml", };
  6. static void timeTest() {
  7. XMLDocument* doc = new XMLDocument();
  8. clock_t startTime = clock();
  9. doc->LoadFile(fileNames[].c_str());
  10. clock_t loadTime = clock();
  11. int errorID = doc->ErrorID();
  12. delete doc;
  13. doc = ;
  14. clock_t deleteTime = clock();
  15.  
  16. printf("Test file '%s' loaded. ErrorID=%d\n", fileNames[].c_str(),
  17. errorID);
  18. if (!errorID) {
  19. printf("Load time=%lf sec\n",
  20. (double) (loadTime - startTime) / CLOCKS_PER_SEC);
  21. printf("Delete time=%lf sec\n",
  22. (double) (deleteTime - loadTime) / CLOCKS_PER_SEC);
  23. printf("Total time=%lf sec\n",
  24. (double) (deleteTime - startTime) / CLOCKS_PER_SEC);
  25. }
  26. }
  27. static void parseTest() {
  28. static const char* xml = "<?xml version=\"1.0\"?>"
  29. "<!DOCTYPE PLAY SYSTEM \"play.dtd\">"
  30. "<PLAY>"
  31. "<TITLE>A Midsummer Night's Dream</TITLE>"
  32. "</PLAY>";
  33.  
  34. XMLDocument doc;
  35. doc.Parse(xml);
  36.  
  37. XMLElement* titleElement = doc.FirstChildElement("PLAY")->FirstChildElement(
  38. "TITLE");
  39. const char* title = titleElement->GetText();
  40. printf("Name of play (1): %s\n", title);
  41.  
  42. XMLText* textNode = titleElement->FirstChild()->ToText();
  43. title = textNode->Value();
  44. printf("Name of play (2): %s\n", title);
  45. }
  46. static void valueTest() {
  47. static const char* xml = "<information>"
  48. " <attributeApproach v='2' />"
  49. " <textApproach>"
  50. " <v>2</v>"
  51. " </textApproach>"
  52. "</information>";
  53.  
  54. XMLDocument doc;
  55. doc.Parse(xml);
  56.  
  57. int v0 = ;
  58. int v1 = ;
  59.  
  60. XMLElement* attributeApproachElement =
  61. doc.FirstChildElement()->FirstChildElement("attributeApproach");
  62. attributeApproachElement->QueryIntAttribute("v", &v0);
  63.  
  64. XMLElement* textApproachElement =
  65. doc.FirstChildElement()->FirstChildElement("textApproach");
  66. textApproachElement->FirstChildElement("v")->QueryIntText(&v1);
  67.  
  68. printf("Both values are the same: %d and %d\n", v0, v1);
  69. }
  70. static void DOMTest() {
  71. // Test: Programmatic DOM
  72. // Build:
  73. // <element>
  74. // <!--comment-->
  75. // <sub attrib="1" />
  76. // <sub attrib="2" />
  77. // <sub attrib="3" >& Text!</sub>
  78. // <element>
  79.  
  80. XMLDocument* doc = new XMLDocument();
  81. XMLNode* element = doc->InsertEndChild(doc->NewElement("element"));
  82.  
  83. XMLElement* sub[] = { doc->NewElement("sub"), doc->NewElement("sub"),
  84. doc->NewElement("sub") };
  85. for (int i = ; i < ; ++i) {
  86. sub[i]->SetAttribute("attrib", i);
  87. }
  88. element->InsertEndChild(sub[]);
  89. XMLNode* comment = element->InsertFirstChild(doc->NewComment("comment"));
  90. comment->SetUserData((void*) );
  91. element->InsertAfterChild(comment, sub[]);
  92. element->InsertAfterChild(sub[], sub[]);
  93. sub[]->InsertFirstChild(doc->NewText("& Text!"));
  94. doc->Print();
  95. printf("-------------------------------------------------------------\n");
  96. // And now deletion:
  97. element->DeleteChild(sub[]);
  98. doc->DeleteNode(comment);
  99.  
  100. element->FirstChildElement()->SetAttribute("attrib", true);
  101. element->LastChildElement()->DeleteAttribute("attrib");
  102. doc->Print();
  103. printf("-------------------------------------------------------------\n");
  104. int value1 = ;
  105. int value2 = doc->FirstChildElement()->LastChildElement()->IntAttribute(
  106. "attrib", );
  107. int result =
  108. doc->FirstChildElement()->LastChildElement()->QueryIntAttribute(
  109. "attrib", &value1);
  110.  
  111. doc->Print();
  112. printf("-------------------------------------------------------------\n");
  113.  
  114. {
  115. XMLPrinter streamer;
  116. doc->Print(&streamer);
  117. printf("%s", streamer.CStr());
  118. }
  119. {
  120. XMLPrinter streamer(, true);
  121. doc->Print(&streamer);
  122. }
  123. doc->SaveFile("./resources/pretty.xml");
  124. doc->SaveFile("./resources/compact.xml", true);
  125. delete doc;
  126. }
  127. static void attrTest() {
  128. const char* str = "<doc/>";
  129.  
  130. XMLDocument doc;
  131. doc.Parse(str);
  132.  
  133. XMLElement* ele = doc.FirstChildElement();
  134.  
  135. int iVal, iVal2;
  136. double dVal, dVal2;
  137.  
  138. ele->SetAttribute("str", "strValue");
  139. ele->SetAttribute("int", );
  140. ele->SetAttribute("double", -1.0);
  141.  
  142. const char* cStr = ele->Attribute("str");
  143. ele->QueryIntAttribute("int", &iVal);
  144. cout << iVal << endl;
  145. ele->QueryDoubleAttribute("double", &dVal);
  146.  
  147. ele->QueryAttribute("int", &iVal2);
  148. ele->QueryAttribute("double", &dVal2);
  149. cout << dVal2 << endl;
  150.  
  151. }
  152. static void textTest() {
  153. const char* str = "<foo>This is text</foo>";
  154. XMLDocument doc;
  155. doc.Parse(str);
  156. XMLElement* element = doc.RootElement();
  157. cout << element->GetText() << endl;
  158. element->SetText("abcd");
  159. cout << element->GetText() << endl;
  160. doc.Print();
  161. printf("-------------------------------------------------------------\n");
  162. }
  163. static void printerTest() {
  164. FILE* printerfp = fopen("resources/printer.xml", "w");
  165. XMLPrinter printer(printerfp);
  166. printer.OpenElement("foo");
  167. printer.PushAttribute("attrib-text", "text");
  168. printer.PushAttribute("attrib-int", int());
  169. printer.PushAttribute("attrib-unsigned", unsigned());
  170. printer.PushAttribute("attrib-int64", int64_t());
  171. printer.PushAttribute("attrib-bool", true);
  172. printer.PushAttribute("attrib-double", 4.0);
  173. printer.CloseElement();
  174. fclose(printerfp);
  175.  
  176. XMLDocument doc;
  177. doc.LoadFile("resources/printer.xml");
  178.  
  179. const XMLDocument& cdoc = doc;
  180.  
  181. const XMLAttribute* attrib = cdoc.FirstChildElement("foo")->FindAttribute(
  182. "attrib-text");
  183. attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int");
  184. cout << attrib->Value() << endl;
  185. attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-unsigned");
  186. cout << attrib->IntValue() << endl;
  187. attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-bool");
  188. cout << attrib->BoolValue() << endl;
  189. attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double");
  190. cout << attrib->DoubleValue() << endl;
  191. }
  192.  
  193. }

C++ XML文件解析的更多相关文章

  1. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  2. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  3. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

  4. Android之AndroidManifest.xml文件解析

    转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...

  5. 9.XML文件解析

    一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...

  6. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  7. Python3将xml文件解析为Python对象

    一.说明 从最开始写javascript开始,我就很烦感使用getElementById()等函数来获取节点的方法,获取了一个节点要访问其子孙节点要么child半天要么就再来一个getElementB ...

  8. XML文件解析-DOM4J方式和SAX方式

    最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...

  9. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

  10. XML文件解析之JDOM解析

    1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...

随机推荐

  1. LeetCode6.Z字形变换 JavaScript

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

  2. redis sentinel搭建以及在jedis中使用

    一.redis主从搭建 1.搭建redis master 1>redis安装 mkdir -p /usr/local/webserver/redis //安装目录 cd /usr/local/w ...

  3. 阿里云服务器redis启动绑定ip 开放端口仍无法访问问题

    今天使用云服务器其redis 始终无法访问.redis.conf 这个配置文件也是改了又改.最后发现 执行redis启动命令时没有带上配置文件.仍然使用默认配置. src/redis-server  ...

  4. 如何在match中使用正则表达式

    这是在实现搜索功能的时候遇到的一个问题,在搜索的场景中,会根据搜索框中输入的内容,匹配出包含搜索内容的部分.简单模拟还原使用场景: 首先定义一个遍历 value 用来接收输入的内容 var value ...

  5. 安装Chrome插件

    重装系统后重装了Chrome浏览器,想着将自己的东西同步到Chrome上.但是登录谷歌账号要FQ,我又是靠setup插件FQ,但插件又要靠账号同步到本地.形成了死循环. 其实重装系统前我将插件提取了, ...

  6. Python数值

    一.python数值类型 python数值类型有以下四种: int(整数) float(浮点数) complex(复数) bool(布尔型) 注意:python3取消了long型.  二.python ...

  7. npm run build打包后自定义动画没有执行

    问题描述:在vue项目中,当你自己写了一些自定义动画效果,然后你npm run build打包项目放到线上环境后,发现动画并没有效果. 解决办法:在vue项目中找到build文件夹下的vue-load ...

  8. apache使用.htaccess文件中RewriteRule重定向后,URL中的加号无法解析

    今天在使用.htaccess做伪静态的时候,发生一件怪事,URL里存在C++时会有问题,在处理C++这个词的时候,无论如何,$_GET都得不到++,只能得到C空格. 一开始我以为是没用urlencod ...

  9. JS 红包随机

    微信随机红包,指定金额指定用户,随机发送红包 var moneys = new Array(); var moneyTotal = 0; function rand(obj){ if(obj.size ...

  10. Hue联合(hdfs yarn hive) 后续......................

    1.启动hdfs,yarn start-all.sh 2.启动hive $ bin/hive $ bin/hive --service metastore & $ bin/hive --ser ...