CentOS 编译安装TinyXml2

不念不忘少年蓝@ 2024-02-21 11:12 84阅读 0赞

安装

TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2

步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/
7dd2acd0a9334a5fb03dc1872aae8788.png 步骤2:下载完成后,需要将源代码解压,可以使用以下命令:

  1. tar -zxvf tinyxml2-8.1.0.tar.gz

65e1f2f70975454aa05a55e63a046877.png

步骤3:解压后,切换到源代码目录:

  1. cd tinyxml2-8.1.0

步骤4:执行make && make install 命令进行安装:

  1. make && make install

温馨提示:完成以上步骤后,在/usr/local/lib下会生成libtinyxml2.so动态库和/usr/local/include下生成tinyxml2.h头文件。你可以使用以下命令查看是否安装成功:

  1. ls /usr/local/lib | grep tinyxml2
  2. ls /usr/local/include | grep tinyxml2

如果看到libtinyxml2.so和tinyxml2.h,则说明成功安装了tinyxml库。

TinyXml2 库

简介

TinyXML2 是简单实用的开源的 C++XML 文件解析库,可以很方便的应用到现有的项 目之中。 TinyXML2 解析器相对 TinyXML1 在代码上是完全重写,使其更适合于游戏开发 中使用。它使用更少的内存,更快,并使用更少的内存分配。

由于 XML 的树状结构,TinyXML2 将 XML 的节点抽象为 XMLNode,XML 中除了把属 性 key-value 抽象为 XMLAttribute 类型外,其余的都看作 XMLNode 的子类,首先将整个 XML 文档抽象为 XMLDocument,将声明部分抽象为 XMLDeclaration,将注释抽象为 XMLComment,将元素抽象为 XMLElement,将文本抽象为 XMLText。

核心:节点、元素、属性和值

XMLAttribute 是解析 XML 的属性的类,XML 中的属性都与 XML 的 Element 绑定,并且为 key-value 类型。

XMLComment 主要是处理 XML 注释的类,注释的存储形式为””。

XMLDeclaration 主要是处理 XML 中声明的类,声明的存储形式为”<? declaration ?>”。 XMLDocument 代表 XML 整个实体,TinyXML2 中只有 XMLDocument 类可以被实例化,其他的类必

须通过 XMLDocument 提供的 new 方法进行实例化,而不能直接实例化。XMLNode

的其他实体类把构造函数定义为 protected,不能被外部实例化,这样保证使用 XMLDocument 进行内存的管理,避免产生内存泄漏的风险。

XMLElement XMLElement 类是 XMLNode 中最重要的一个类,其存储方式有 两 种 形 式 , 它 包 含 了 一 个 XMLAttribute 的 根 指 针 , 这 个 root 指 针 指 向 XMLAttribute 的第一个属性键值对。

XMLHandle 主要用来访问元素。

XMLNode 是几乎 XML 所有元素(XMLAttribute 除外)的基类,XML 本质是一种树形结构,而 整个 XML 就是由许多的节点(XMLNode)组成,在 TinyXML2 中每个 XMLNode 节点都 保存了父亲、前驱、后继、孩子头节点和孩子尾节点信息,便于查询、插入、检 索。

XMLPrinter 是 XMLVisitor 类的子类,主要实现的写 XML 的功能,其提供了两种书写方式,一 是构建 XMLDocument,二是直接 push 字段。

XMLText 主要是处理 XML 文本的类,文本信息又分为 CDATA 和普通文本。CDATA 是有专属的 开始字符”<![CDATA[“,而普通的文本存储形式如”>text<”。

XMLUnknown 存储形式为”<! unknown>”。

XMLVisitor 访问者模式的基类,它主要定义了访问者的接口,而在 XMLNode 的子类的 accept 方法中调用这些方法来完成对自身的访问。

示例代码

前提条件:在/usr/local/source_code 创建目录:tinyxml_demmo,并创建tinyXmlDemo.cpp文件,文件内容如下:

  1. #include <iostream>
  2. #include "tinyxml2.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. using namespace tinyxml2;
  6. /*
  7. enum XMLError {
  8. XML_SUCCESS = 0,
  9. XML_NO_ATTRIBUTE,
  10. XML_WRONG_ATTRIBUTE_TYPE,
  11. XML_ERROR_FILE_NOT_FOUND,
  12. XML_ERROR_FILE_COULD_NOT_BE_OPENED,
  13. XML_ERROR_FILE_READ_ERROR,
  14. XML_ERROR_PARSING_ELEMENT,
  15. XML_ERROR_PARSING_ATTRIBUTE,
  16. XML_ERROR_PARSING_TEXT,
  17. XML_ERROR_PARSING_CDATA,
  18. XML_ERROR_PARSING_COMMENT,
  19. XML_ERROR_PARSING_DECLARATION,
  20. XML_ERROR_PARSING_UNKNOWN,
  21. XML_ERROR_EMPTY_DOCUMENT,
  22. XML_ERROR_MISMATCHED_ELEMENT,
  23. XML_ERROR_PARSING,
  24. XML_CAN_NOT_CONVERT_TEXT,
  25. XML_NO_TEXT_NODE,
  26. XML_ELEMENT_DEPTH_EXCEEDED,
  27. XML_ERROR_COUNT
  28. };
  29. */
  30. //创建XML文件
  31. int createXML(const char* xmlPath)
  32. {
  33. XMLDocument doc;
  34. if (XML_ERROR_FILE_NOT_FOUND != doc.LoadFile(xmlPath)) {
  35. std::cout << "file has been existed !" << std::endl;
  36. return 0;
  37. }
  38. //添加声明 <?xml version="1.0" encoding="UTF-8" ?>
  39. XMLDeclaration *declaration = doc.NewDeclaration();
  40. doc.InsertFirstChild(declaration);
  41. XMLElement *root = doc.NewElement("Users");
  42. doc.InsertEndChild(root);
  43. XMLElement *userNode = doc.NewElement("User");
  44. //添加属性
  45. userNode->SetAttribute("Name", "milo");
  46. userNode->SetAttribute("Password", "pwd");
  47. root->InsertEndChild(userNode);
  48. return doc.SaveFile(xmlPath);
  49. }
  50. void loadXML(const char* xmlPath) {
  51. XMLDocument doc;
  52. if (doc.LoadFile(xmlPath) != XML_SUCCESS) {
  53. std::cout << "load xlm file failed" << std::endl;
  54. return;
  55. }
  56. XMLPrinter printer;
  57. doc.Print( &printer);
  58. std::cout << printer.CStr();
  59. }
  60. //添加性别,号码,邮箱 再添加一个用户
  61. int addXML1(const char* xmlPath) {
  62. XMLDocument doc;
  63. if (doc.LoadFile(xmlPath) != XML_SUCCESS) {
  64. std::cout << "load xlm file failed" << std::endl;
  65. return -1;
  66. }
  67. XMLElement *root = doc.RootElement();
  68. XMLElement *userNode = root->FirstChildElement("User");
  69. XMLElement *gender = doc.NewElement("Gender");
  70. XMLText* genderText = doc.NewText("man");
  71. gender->InsertFirstChild(genderText);
  72. userNode->InsertFirstChild(gender);
  73. XMLElement *mobile = doc.NewElement("Mobile");
  74. mobile->InsertFirstChild(doc.NewText("186****3143"));
  75. userNode->InsertEndChild(mobile);
  76. XMLElement *email = doc.NewElement("Email");
  77. email->InsertFirstChild(doc.NewText("472251823@qq.com"));
  78. userNode->InsertEndChild(email);
  79. XMLElement *userNode2 = doc.NewElement("User");
  80. userNode2->SetAttribute("Name", "king");
  81. userNode2->SetAttribute("Password", "pwd2");
  82. root->InsertEndChild(userNode2);
  83. XMLElement *mobile2 = doc.NewElement("Mobile");
  84. mobile2->InsertFirstChild(doc.NewText("186****3143"));
  85. userNode2->InsertEndChild(mobile2);
  86. return doc.SaveFile(xmlPath);
  87. }
  88. //在性别后面添加年龄,再添加一个号码
  89. int addXML2(const char* xmlPath)
  90. {
  91. XMLDocument doc;
  92. if (doc.LoadFile(xmlPath) != XML_SUCCESS)
  93. {
  94. std::cout<<"load xml file failed"<<std::endl;
  95. return false;
  96. }
  97. XMLElement* root=doc.RootElement();
  98. XMLElement* userNode=root->FirstChildElement("User");
  99. XMLElement* gender = userNode->FirstChildElement("Gender");
  100. XMLElement* age = doc.NewElement("Age");
  101. age->InsertFirstChild(doc.NewText("18"));
  102. userNode->InsertAfterChild(gender,age);
  103. XMLElement* mobile = userNode->FirstChildElement("Mobile");
  104. mobile->SetAttribute("Location","home");
  105. XMLElement* mobile1 = doc.NewElement("Mobile");
  106. mobile1->SetAttribute("Location","company");
  107. mobile1->InsertFirstChild(doc.NewText("186****3143"));
  108. userNode->InsertAfterChild(mobile, mobile1);
  109. return doc.SaveFile(xmlPath);
  110. }
  111. //删除第一个号码,删除第二个号码的属性
  112. int deleteXML(const char* xmlPath) {
  113. XMLDocument doc;
  114. if (doc.LoadFile(xmlPath) != XML_SUCCESS) {
  115. std::cout << "load xlm file failed" << std::endl;
  116. return -1;
  117. }
  118. XMLElement *root = doc.RootElement();
  119. XMLElement *userNode = root->FirstChildElement("User");
  120. XMLElement *mobile = userNode->FirstChildElement("Mobile");
  121. userNode->DeleteChild(mobile);
  122. XMLElement *mobile2 = userNode->FirstChildElement("Mobile");
  123. mobile2->DeleteAttribute("Location");
  124. return doc.SaveFile(xmlPath);
  125. }
  126. //将milo的年龄改为10000岁,将king的号码改为8888结尾
  127. int updateXML(const char* xmlPath) {
  128. XMLDocument doc;
  129. if (doc.LoadFile(xmlPath) != XML_SUCCESS) {
  130. std::cout << "load xlm file failed" << std::endl;
  131. return -1;
  132. }
  133. XMLElement *root = doc.RootElement();
  134. XMLElement *userNode = root->FirstChildElement("User");
  135. while (userNode != NULL) {
  136. if (0 == strncmp("milo", (userNode->Attribute("Name")), 11)) {
  137. userNode->FirstChildElement("Age")->SetText("10000");
  138. userNode = userNode->NextSiblingElement();
  139. } else if (0 == strncmp("king", (userNode->Attribute("Name")), 11)) {
  140. userNode->FirstChildElement("Mobile")->SetText("186****8888");
  141. userNode = userNode->NextSiblingElement();
  142. } else {
  143. userNode = userNode->NextSiblingElement();
  144. }
  145. }
  146. return doc.SaveFile(xmlPath);
  147. }
  148. //将milo的信息打印出来
  149. int selectXML(const char* xmlPath)
  150. {
  151. XMLDocument doc;
  152. if(doc.LoadFile(xmlPath)!=XML_SUCCESS)
  153. {
  154. std::cout<<"load xml file failed"<<std::endl;
  155. return false;
  156. }
  157. XMLElement* root=doc.RootElement();
  158. XMLElement* userNode=root->FirstChildElement("User");
  159. while(userNode != NULL)
  160. {
  161. if( 0 == strncmp("milo",(userNode->Attribute("Name")),11))
  162. {
  163. std::cout << userNode->Attribute("Name") << std::endl;
  164. std::cout << userNode->Attribute("Password") << std::endl;
  165. std::cout << userNode->FirstChildElement("Age")->GetText() << std::endl;
  166. std::cout << userNode->FirstChildElement("Gender")->GetText() << std::endl;
  167. std::cout << userNode->FirstChildElement("Mobile")->GetText() << std::endl;
  168. std::cout << userNode->FirstChildElement("Email")->GetText() << std::endl;
  169. userNode = userNode->NextSiblingElement();
  170. } else {
  171. userNode = userNode->NextSiblingElement();
  172. }
  173. }
  174. return 0;
  175. }
  176. int main( int argc, const char ** argv )
  177. {
  178. char xmlPath[] = "./0voice.xml";
  179. /*创建*/
  180. createXML(xmlPath);
  181. loadXML(xmlPath);
  182. printf("------------------------------\n");
  183. /*增*/
  184. addXML1(xmlPath);
  185. loadXML(xmlPath);
  186. printf("------------------------------\n");
  187. addXML2(xmlPath);
  188. loadXML(xmlPath);
  189. printf("------------------------------\n");
  190. /*删*/
  191. deleteXML(xmlPath);
  192. loadXML(xmlPath);
  193. printf("------------------------------\n");
  194. /*改*/
  195. updateXML(xmlPath);
  196. loadXML(xmlPath);
  197. printf("------------------------------\n");
  198. /*查*/
  199. selectXML(xmlPath);
  200. return 0;
  201. }

源码编译,执行如下指令:

  1. g++ tinyXmlDemo.cpp -o tinyXmlDemo -L/usr/local/lib/ -ltinyxml2

执行效果截图:

  1. [root@localhost tinyxml_demmo]# g++ tinyXmlDemo.cpp -o tinyXmlDemo -L/usr/local/lib/ -ltinyxml2
  2. [root@localhost tinyxml_demmo]# ll
  3. 总用量 120
  4. -rw-r--r--. 1 root root 168 10 23 15:36 parseXml.xml
  5. -rwxr-xr-x. 1 root root 110536 10 23 15:48 tinyXmlDemo
  6. -rw-r--r--. 1 root root 7091 10 23 15:47 tinyXmlDemo.cpp
  7. [root@localhost tinyxml_demmo]# ./tinyXmlDemo
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <Users>
  10. <User Name="milo" Password="pwd"/>
  11. </Users>
  12. ------------------------------
  13. <?xml version="1.0" encoding="UTF-8"?>
  14. <Users>
  15. <User Name="milo" Password="pwd">
  16. <Gender>man</Gender>
  17. <Mobile>186****3143</Mobile>
  18. <Email>472251823@qq.com</Email>
  19. </User>
  20. <User Name="king" Password="pwd2">
  21. <Mobile>186****3143</Mobile>
  22. </User>
  23. </Users>
  24. ------------------------------
  25. <?xml version="1.0" encoding="UTF-8"?>
  26. <Users>
  27. <User Name="milo" Password="pwd">
  28. <Gender>man</Gender>
  29. <Age>18</Age>
  30. <Mobile Location="home">186****3143</Mobile>
  31. <Mobile Location="company">186****3143</Mobile>
  32. <Email>472251823@qq.com</Email>
  33. </User>
  34. <User Name="king" Password="pwd2">
  35. <Mobile>186****3143</Mobile>
  36. </User>
  37. </Users>
  38. ------------------------------
  39. <?xml version="1.0" encoding="UTF-8"?>
  40. <Users>
  41. <User Name="milo" Password="pwd">
  42. <Gender>man</Gender>
  43. <Age>18</Age>
  44. <Mobile>186****3143</Mobile>
  45. <Email>472251823@qq.com</Email>
  46. </User>
  47. <User Name="king" Password="pwd2">
  48. <Mobile>186****3143</Mobile>
  49. </User>
  50. </Users>
  51. ------------------------------
  52. <?xml version="1.0" encoding="UTF-8"?>
  53. <Users>
  54. <User Name="milo" Password="pwd">
  55. <Gender>man</Gender>
  56. <Age>10000</Age>
  57. <Mobile>186****3143</Mobile>
  58. <Email>472251823@qq.com</Email>
  59. </User>
  60. <User Name="king" Password="pwd2">
  61. <Mobile>186****8888</Mobile>
  62. </User>
  63. </Users>
  64. ------------------------------
  65. milo
  66. pwd
  67. 10000
  68. man
  69. 186****3143
  70. 472251823@qq.com

发表评论

表情:
评论列表 (有 0 条评论,84人围观)

还没有评论,来说两句吧...

相关阅读