XML配置文件解析数据并在vs环境中用C++代码进行数据插入数据库操作
输入:首先你要有你的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后一个参数一定要用字符串,当你想插入一个变量在数据库中,一定要把变量字符化,即下面代码
string str = "insert into xmldata(NAME,AttributeTime, ENTITYAttributeID,ENTITYPOSX,ENTITYPOSY,ENTITYACTIVITY) VALUES (";
str += to_string(s);
str += ",";
str += to_string(FrameNum);
str += ",";
str += to_string(IDINT);
str += ",";
str += to_string(POSX);
str += ",";
str += to_string(POSY);
str += ",'";
str += activaty;
str += "'";
str += ")";
最后是我的一个源码,仅供参考。
// XMLtest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "tinyxml.h"
#include "tinystr.h"
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <WinSock.h>
#include <Windows.h>
#include <mysql.h>
MYSQL mysql; //mysql连接
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row; //char** 二维数组,存放一条条记录
const char DataBase_UserName[] = "root"; //数据库用户名username
const char DataBase_Password[] = ""; //数据库密码,填自己的密码
const char DataBase_Host[] = "localhost"; //数据库连接地址
//注意有时候使用主机ip会报错,此时可以将ip改为localhost
const char DataBase_Name[] = "xml_database"; //database name
unsigned int DataBase_Port = 3306; //server port
using namespace std;
using std::vector;
using std::count;
bool ConnectDatabase()
{
//初始化mysql
mysql_init(&mysql); //连接mysql,数据库
if (!(mysql_real_connect(&mysql, DataBase_Host, DataBase_UserName, DataBase_Password, DataBase_Name, DataBase_Port, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
{
printf("Error connecting to database:%s\n", mysql_error(&mysql));
return false;
}
else
{
MessageBoxA(NULL, "连接MYSQL数据成功!", "消息", MB_OK);
printf("Connected...\n");
return true;
}
}
int XMLtoCSVintoOnesheet()
{
//帧计数器
int FrameNum = 0;
//获取XML文件
TiXmlDocument* myDocument = new TiXmlDocument("20210315.xml");
//解析XML文件
//myDocument->LoadFile();
bool loadResult = myDocument->LoadFile();
if (!loadResult)
{
printf("Load XML file error\n");
return 0;
}
打开CSV准备对应Frame列表
//ofstream outFile;
//string FileName;
//FileName = "Frame-15000pawn.csv";//设置列表名称
//outFile.open(FileName, ios::out);
设置CSV文件头
//outFile << ',' << "Name" << ',' << "Attribute:TIME" << ',' << "ENTITY.Attribute:ID" << ',' << "ENTITY.POSX" << ',' << "ENTITY.POSY" << ',' << "ENTITY.POSZ" << ',' << "ENTITY.ACTIVITY" << endl;
mysql_query(&mysql, "use xmldata");
float POSZ = 0;
//获得根元素,即LEGION_ANIMATION
TiXmlElement* RootElement = myDocument->RootElement();
//输出根元素名称,即输出LEGION_ANIMATION
/*cout << RootElement->Value() << endl;*/
//遍历FRAMEELement节点
for (
//第一个FRAME元素
TiXmlElement* FRAMEElement = RootElement->FirstChildElement();
FRAMEElement != NULL;
//下一个FRAME元素
FRAMEElement = FRAMEElement->NextSiblingElement())
{
//获得当前FRAME的TIME属性
TiXmlAttribute* TIMEAttribute = FRAMEElement->FirstAttribute();
cout << TIMEAttribute->Value() << endl;
FrameNum = FrameNum + 1;
//遍历ENTITYElement节点
for (
//第一个ENTITY元素
TiXmlElement* ENTITYElement = FRAMEElement->FirstChildElement();
ENTITYElement != NULL;
//下一个ENTITY元素
ENTITYElement = ENTITYElement->NextSiblingElement())
{
//获得当前ENTITY的ID属性
TiXmlAttribute* IDAttribute = ENTITYElement->FirstAttribute();
/* cout << IDAttribute->Value() << endl;*/
//获得当前ENTITY的子元素
TiXmlElement* POSElement = ENTITYElement->FirstChildElement();
TiXmlElement* ACTIVATYElement = POSElement->NextSiblingElement();
// cout << POSElement->FirstChild()->Value() << endl;
// cout << ACTIVATYElement->FirstChild()->Value() << endl;
string POS = POSElement->FirstChild()->Value();
int pos1 = 0, pos2 = 0;
int length1 = POS.length();
string pattern = ",";
pos2 = POS.find(pattern, pos1);
string POSXSTR = POS.substr(pos1, pos2 - pos1);
string POSYSTR = POS.substr(pos2 + 1, length1);
float POSX = atof(POSXSTR.c_str()) * 100;
float POSY = atof(POSYSTR.c_str()) * 100;
// cout << POSX << endl;
// cout << POSY << endl;
/*if (POSX >= 13891.909, POSY > -2548.83473)
{
POSX = POSX - 14215.76808;
POSY = POSY - 108.76641;
POSZ = 2900;
}
if (POSY <= -2548.83473)
{
if (POSX < 13891.909)
{
POSX = POSX + 650.77849;
POSY = POSY - 18848.79243;
POSZ = 1500;
}
else
{
POSX = POSX + -13776.33675;
POSY = POSY - 18903.85591;
POSZ = 1820;
}
}*/
//写CSV行内容
const char* ID = IDAttribute->Value();
int IDINT = atoi(ID);
if (IDINT <= 15000)
{
double num = FrameNum;
while (num >= 1){
num = num / 10;
}
double s = IDINT+num;
string activaty = ACTIVATYElement->FirstChild()->Value();
cout << s << " " << FrameNum << " " << IDAttribute->Value() << " " << POSX << " " << POSY << " " << activaty << endl;
string str = "insert into xmldata(NAME,AttributeTime, ENTITYAttributeID,ENTITYPOSX,ENTITYPOSY,ENTITYACTIVITY) VALUES (";
str += to_string(s);
str += ",";
str += to_string(FrameNum);
str += ",";
str += to_string(IDINT);
str += ",";
str += to_string(POSX);
str += ",";
str += to_string(POSY);
str += ",'";
str += activaty;
str += "'";
str += ")";
cout << str;
int ret=mysql_query(&mysql,str.c_str());
if (ret != 0)
{
printf("error:%s\n", mysql_error(&mysql));
getchar();
exit(1);
}
}
/*const char* ID = IDAttribute->Value();
int IDINT = atoi(ID);*/
//if (IDINT <= 15000)
//{
// //输出CSV文件
// outFile << ID << '-' << FrameNum << ',' << ID << '-' << FrameNum << ',' << FrameNum << ',' << IDAttribute->Value() << ',' << POSX << ',' << POSY << ',' << POSZ << ',' << ACTIVATYElement->FirstChild()->Value() << endl;
//}
}
}
return 1;
}
int main()
{
ConnectDatabase(); //连接数据库
mysql_query(&mysql, "use xmldata");
int k=XMLtoCSVintoOnesheet();
mysql_close(&mysql); //关闭数据库
return 0;
}
附上一张数据输入数据库的截图((●’◡’●))
哈哈哈,总共150万个数据,跑死我了。
难受。溜了溜了(下班了)。
还没有评论,来说两句吧...