XML配置文件解析数据并在vs环境中用C++代码进行数据插入数据库操作

旧城等待, 2023-01-23 11:54 33阅读 0赞

输入:首先你要有你的XML文件,用于解析。

输出:MySQL(MySQL(mysql-5.7.29-winx64)版本

环境:vs2013(x64版本)

依赖文件:TinyXML第三方库,**WinSock,hWindows,hmysql等库文件**

TinyXML用于解析XML文件,并通过它的一些接口对这些解析好的数据进行访问,它包括两个头文件和四个cpp文件,较为简单。

WinSock,hWindows,hmysql库文件则是对vs提供一些MySQL的接口和依赖。

根据我的实现,最重要的是两个点吧:一个是XML的解析,这点可以查找一些TinyXML的官方文档,了解它提供接口进行使用的。我使用的是它的根元素,然后循环遍历它的各个节点元素。第二个当然是获得数据,把数据输入到数据库中,当你在vs中连接数据库成功(最后代码中的connect函数中)。即可声明一个MySQL权柄,然后使用mysql提供的mysql_query(权柄,字符串(你所要对数据库进行的操作))函数进行一个数据库的数据插入操作。注意:这里的mysql_query后一个参数一定要用字符串,当你想插入一个变量在数据库中,一定要把变量字符化,即下面代码

  1. string str = "insert into xmldata(NAME,AttributeTime, ENTITYAttributeID,ENTITYPOSX,ENTITYPOSY,ENTITYACTIVITY) VALUES (";
  2. str += to_string(s);
  3. str += ",";
  4. str += to_string(FrameNum);
  5. str += ",";
  6. str += to_string(IDINT);
  7. str += ",";
  8. str += to_string(POSX);
  9. str += ",";
  10. str += to_string(POSY);
  11. str += ",'";
  12. str += activaty;
  13. str += "'";
  14. str += ")";

最后是我的一个源码,仅供参考。

  1. // XMLtest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <iostream>
  5. #include "tinyxml.h"
  6. #include "tinystr.h"
  7. #include <sstream>
  8. #include <fstream>
  9. #include <string>
  10. #include <vector>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <algorithm>
  14. #include <WinSock.h>
  15. #include <Windows.h>
  16. #include <mysql.h>
  17. MYSQL mysql; //mysql连接
  18. MYSQL_RES* res; //一个结果集结构体
  19. MYSQL_ROW row; //char** 二维数组,存放一条条记录
  20. const char DataBase_UserName[] = "root"; //数据库用户名username
  21. const char DataBase_Password[] = ""; //数据库密码,填自己的密码
  22. const char DataBase_Host[] = "localhost"; //数据库连接地址
  23. //注意有时候使用主机ip会报错,此时可以将ip改为localhost
  24. const char DataBase_Name[] = "xml_database"; //database name
  25. unsigned int DataBase_Port = 3306; //server port
  26. using namespace std;
  27. using std::vector;
  28. using std::count;
  29. bool ConnectDatabase()
  30. {
  31. //初始化mysql
  32. mysql_init(&mysql); //连接mysql,数据库
  33. if (!(mysql_real_connect(&mysql, DataBase_Host, DataBase_UserName, DataBase_Password, DataBase_Name, DataBase_Port, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
  34. {
  35. printf("Error connecting to database:%s\n", mysql_error(&mysql));
  36. return false;
  37. }
  38. else
  39. {
  40. MessageBoxA(NULL, "连接MYSQL数据成功!", "消息", MB_OK);
  41. printf("Connected...\n");
  42. return true;
  43. }
  44. }
  45. int XMLtoCSVintoOnesheet()
  46. {
  47. //帧计数器
  48. int FrameNum = 0;
  49. //获取XML文件
  50. TiXmlDocument* myDocument = new TiXmlDocument("20210315.xml");
  51. //解析XML文件
  52. //myDocument->LoadFile();
  53. bool loadResult = myDocument->LoadFile();
  54. if (!loadResult)
  55. {
  56. printf("Load XML file error\n");
  57. return 0;
  58. }
  59. 打开CSV准备对应Frame列表
  60. //ofstream outFile;
  61. //string FileName;
  62. //FileName = "Frame-15000pawn.csv";//设置列表名称
  63. //outFile.open(FileName, ios::out);
  64. 设置CSV文件头
  65. //outFile << ',' << "Name" << ',' << "Attribute:TIME" << ',' << "ENTITY.Attribute:ID" << ',' << "ENTITY.POSX" << ',' << "ENTITY.POSY" << ',' << "ENTITY.POSZ" << ',' << "ENTITY.ACTIVITY" << endl;
  66. mysql_query(&mysql, "use xmldata");
  67. float POSZ = 0;
  68. //获得根元素,即LEGION_ANIMATION
  69. TiXmlElement* RootElement = myDocument->RootElement();
  70. //输出根元素名称,即输出LEGION_ANIMATION
  71. /*cout << RootElement->Value() << endl;*/
  72. //遍历FRAMEELement节点
  73. for (
  74. //第一个FRAME元素
  75. TiXmlElement* FRAMEElement = RootElement->FirstChildElement();
  76. FRAMEElement != NULL;
  77. //下一个FRAME元素
  78. FRAMEElement = FRAMEElement->NextSiblingElement())
  79. {
  80. //获得当前FRAME的TIME属性
  81. TiXmlAttribute* TIMEAttribute = FRAMEElement->FirstAttribute();
  82. cout << TIMEAttribute->Value() << endl;
  83. FrameNum = FrameNum + 1;
  84. //遍历ENTITYElement节点
  85. for (
  86. //第一个ENTITY元素
  87. TiXmlElement* ENTITYElement = FRAMEElement->FirstChildElement();
  88. ENTITYElement != NULL;
  89. //下一个ENTITY元素
  90. ENTITYElement = ENTITYElement->NextSiblingElement())
  91. {
  92. //获得当前ENTITY的ID属性
  93. TiXmlAttribute* IDAttribute = ENTITYElement->FirstAttribute();
  94. /* cout << IDAttribute->Value() << endl;*/
  95. //获得当前ENTITY的子元素
  96. TiXmlElement* POSElement = ENTITYElement->FirstChildElement();
  97. TiXmlElement* ACTIVATYElement = POSElement->NextSiblingElement();
  98. // cout << POSElement->FirstChild()->Value() << endl;
  99. // cout << ACTIVATYElement->FirstChild()->Value() << endl;
  100. string POS = POSElement->FirstChild()->Value();
  101. int pos1 = 0, pos2 = 0;
  102. int length1 = POS.length();
  103. string pattern = ",";
  104. pos2 = POS.find(pattern, pos1);
  105. string POSXSTR = POS.substr(pos1, pos2 - pos1);
  106. string POSYSTR = POS.substr(pos2 + 1, length1);
  107. float POSX = atof(POSXSTR.c_str()) * 100;
  108. float POSY = atof(POSYSTR.c_str()) * 100;
  109. // cout << POSX << endl;
  110. // cout << POSY << endl;
  111. /*if (POSX >= 13891.909, POSY > -2548.83473)
  112. {
  113. POSX = POSX - 14215.76808;
  114. POSY = POSY - 108.76641;
  115. POSZ = 2900;
  116. }
  117. if (POSY <= -2548.83473)
  118. {
  119. if (POSX < 13891.909)
  120. {
  121. POSX = POSX + 650.77849;
  122. POSY = POSY - 18848.79243;
  123. POSZ = 1500;
  124. }
  125. else
  126. {
  127. POSX = POSX + -13776.33675;
  128. POSY = POSY - 18903.85591;
  129. POSZ = 1820;
  130. }
  131. }*/
  132. //写CSV行内容
  133. const char* ID = IDAttribute->Value();
  134. int IDINT = atoi(ID);
  135. if (IDINT <= 15000)
  136. {
  137. double num = FrameNum;
  138. while (num >= 1){
  139. num = num / 10;
  140. }
  141. double s = IDINT+num;
  142. string activaty = ACTIVATYElement->FirstChild()->Value();
  143. cout << s << " " << FrameNum << " " << IDAttribute->Value() << " " << POSX << " " << POSY << " " << activaty << endl;
  144. string str = "insert into xmldata(NAME,AttributeTime, ENTITYAttributeID,ENTITYPOSX,ENTITYPOSY,ENTITYACTIVITY) VALUES (";
  145. str += to_string(s);
  146. str += ",";
  147. str += to_string(FrameNum);
  148. str += ",";
  149. str += to_string(IDINT);
  150. str += ",";
  151. str += to_string(POSX);
  152. str += ",";
  153. str += to_string(POSY);
  154. str += ",'";
  155. str += activaty;
  156. str += "'";
  157. str += ")";
  158. cout << str;
  159. int ret=mysql_query(&mysql,str.c_str());
  160. if (ret != 0)
  161. {
  162. printf("error:%s\n", mysql_error(&mysql));
  163. getchar();
  164. exit(1);
  165. }
  166. }
  167. /*const char* ID = IDAttribute->Value();
  168. int IDINT = atoi(ID);*/
  169. //if (IDINT <= 15000)
  170. //{
  171. // //输出CSV文件
  172. // outFile << ID << '-' << FrameNum << ',' << ID << '-' << FrameNum << ',' << FrameNum << ',' << IDAttribute->Value() << ',' << POSX << ',' << POSY << ',' << POSZ << ',' << ACTIVATYElement->FirstChild()->Value() << endl;
  173. //}
  174. }
  175. }
  176. return 1;
  177. }
  178. int main()
  179. {
  180. ConnectDatabase(); //连接数据库
  181. mysql_query(&mysql, "use xmldata");
  182. int k=XMLtoCSVintoOnesheet();
  183. mysql_close(&mysql); //关闭数据库
  184. return 0;
  185. }

附上一张数据输入数据库的截图((●’◡’●))

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FtYmlndW91c19f_size_16_color_FFFFFF_t_70

哈哈哈,总共150万个数据,跑死我了。

难受。溜了溜了(下班了)。

发表评论

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

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

相关阅读