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

该博客介绍了如何使用TinyXML库解析XML文件,并将解析得到的数据批量插入到MySQL数据库中。通过VS2013环境,利用WinSock、hWindows和hmysql库文件建立数据库连接,实现数据的读取和存储。博客详细展示了代码实现过程,包括XML的遍历、数据转换和数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入:首先你要有你的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万个数据,跑死我了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三少爷的剑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值