快速简便的C语言上传XML文件并导入数据库方法 (c 上传xml文件然后导入到数据库)

XML文件是一种用于存储数据的格式,它是一种可以被机器和人类阅读的格式。在实际的开发中,我们通常需要将XML文件中包含的数据导入到数据库中进行处理。本文将介绍使用C语言上传XML文件并将其导入到数据库的方法。

一、XML文件的格式

XML文件是一种标记语言,它的格式如下:

“`xml

1001

张三

25

研发部

1002

李四

30

市场部

1003

王五

35

人事部

“`

其中,“表示XML文件的版本和编码方式。“表示XML文件的根元素。“表示XML文件中的一条记录。“、“、“、“和“分别表示记录中的字段。

二、导入XML文件到数据库

在导入XML文件到数据库之前,我们需要先创建相应的数据库表,并确定表中所需要的字段。

我们使用MySQL数据库,在创建数据库时,可以使用以下命令:

“`sql

CREATE DATABASE test;

“`

创建数据库表时,可以使用以下命令:

“`sql

CREATE TABLE employee(

id INT(11) NOT NULL,

name VARCHAR(30) NOT NULL,

age INT(11) NOT NULL,

gender VARCHAR(10) NOT NULL,

department VARCHAR(20) NOT NULL

);

“`

上述命令创建了一个名为`employee`的表,包含了`id`、`name`、`age`、`gender`和`department`五个字段。

接下来,我们需要编写程序将XML文件中的数据导入到该表中。这里我们使用C语言实现。

我们需要使用libxml2库将XML文件中的数据读取出来。libxml2库是一个用于处理XML和HTML文档的C语言库。我们可以在Ubuntu系统下使用以下命令安装该库:

“`shell

sudo apt-get install libxml2-dev

“`

读取XML文件的示例代码如下:

“`c

#include

#include

#include

#include

#include

static char gszHostName[64] = “127.0.0.1”;

static char gszUserName[64] = “root”;

static char gszPassword[64] = “123456”;

static char gszDatabase[64] = “test”;

static int giPort = 3306;

int insert_employee(MYSQL * mysql, int id, char * name, int age, char * gender, char * department)

{

char szSQL[1024] = {0};

int iRet = 0;

sprintf(szSQL, “insert into employee(id, name, age, gender, department) values(%d, ‘%s’, %d, ‘%s’, ‘%s’)”, id, name, age, gender, department);

iRet = mysql_query(mysql, szSQL);

if (iRet != 0)

{

fprintf(stderr, “insert_employee: mysql_query fled, error=%s\n”, mysql_error(mysql));

return -1;

}

return 0;

}

int parse_xml(const char * szFileName, MYSQL * mysql)

{

xmlDocPtr doc = NULL;

xmlNodePtr rootNode = NULL;

xmlNodePtr node = NULL;

char szId[64] = {0}, szName[64] = {0}, szAge[64] = {0}, szGender[64] = {0}, szDepartment[64] = {0};

int id = 0, age = 0;

doc = xmlReadFile(szFileName, NULL, 0);

if (doc == NULL)

{

fprintf(stderr, “parse_xml: xmlReadFile fled\n”);

return -1;

}

rootNode = xmlDocGetRootElement(doc);

if (rootNode == NULL)

{

fprintf(stderr, “parse_xml: xmlDocGetRootElement fled\n”);

return -1;

}

for (node = rootNode->children; node != NULL; node = node->next)

{

if (strcmp((const char *) node->name, “employee”) == 0)

{

memset(szId, 0, sizeof(szId));

memset(szName, 0, sizeof(szName));

memset(szAge, 0, sizeof(szAge));

memset(szGender, 0, sizeof(szGender));

memset(szDepartment, 0, sizeof(szDepartment));

xmlNodePtr n = NULL;

for (n = node->children; n != NULL; n = n->next)

{

if (strcmp((const char *) n->name, “id”) == 0)

{

strncpy(szId, (const char *) n->content, sizeof(szId) – 1);

}

else if (strcmp((const char *) n->name, “name”) == 0)

{

strncpy(szName, (const char *) n->content, sizeof(szName) – 1);

}

else if (strcmp((const char *) n->name, “age”) == 0)

{

strncpy(szAge, (const char *) n->content, sizeof(szAge) – 1);

}

else if (strcmp((const char *) n->name, “gender”) == 0)

{

strncpy(szGender, (const char *) n->content, sizeof(szGender) – 1);

}

else if (strcmp((const char *) n->name, “department”) == 0)

{

strncpy(szDepartment, (const char *) n->content, sizeof(szDepartment) – 1);

}

}

id = atoi(szId);

age = atoi(szAge);

insert_employee(mysql, id, szName, age, szGender, szDepartment);

}

}

xmlFreeDoc(doc);

return 0;

}

int mn(int argc, char ** argv)

{

const char * szFileName = NULL;

MYSQL mysql;

int iRet = 0;

if (argc == 2)

{

szFileName = argv[1];

}

if (mysql_init(&mysql) == NULL)

{

fprintf(stderr, “mn: mysql_init fled\n”);

return -1;

}

if (mysql_real_connect(&mysql, gszHostName, gszUserName, gszPassword, gszDatabase, giPort, NULL, 0) == NULL)

{

fprintf(stderr, “mn: mysql_real_connect fled\n”);

return -1;

}

iRet = parse_xml(szFileName, &mysql);

mysql_close(&mysql);

return iRet;

}

“`

该程序将读取XML文件并将其导入到MySQL数据库中。需要注意的是,程序中数据库的连接信息需要根据实际情况进行修改,否则会导致程序运行失败。

三、

相关问题拓展阅读:

如何将ON,Text,XML,CSV 数据文件导入 MySQL

将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入某个并大目的地(比如数据库,这里我们讨论MySQL)。

ETL Process

本文要讨论的内唯森容,是如何方便地将多种格式(ON, Text, XML, CSV)的数据导入MySQL之中。

本文大纲:

将Text文件(包括CSV文件)导入MySQL

将XML文件导入MySQL

将ON文件导入MySQL

使用MySQL workbench的Table Data Export and Import Wizard进行ON或CSV文件的导入导出

1. 将Text文件(包括CSV文件)导入MySQL

这里我们的讨论是基于一个假定,Text file和CSV file是有着比较规范的格式的(properly formatted),比如说每行的每个数据域(field)之间是由一个共同的分隔符(比如tab: \t)分隔的。

那么首先,你需要根据你的数据的格式(有哪些域),来设计好数据库的对应的表 (的Schema)。

举个例子,要处理的Text文件或者CSV文件是以\t作为分隔符的,每行有id, name, balance这么三个数据域,那么首先我们需要在数据库中创建这个表:

CREATE TABLE sometable(id INT, name VARCHAR(255), balance DECIMAL(8,4));

创建成功以后就可以导入了。操作方式很简单:

LOAD DATA LOCAL INFILE ‘你的文件路径(如~/file.csv)’ INTO TABLE sometable FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’ (id, name, balance)

这里要注意的是,我们需要开启local-infile这个MySQL的配置参数,才能够成功导入。究其原因,从MySQL的Manual中可以看到这么一段话:

LOCAL works only if your server and your client both have been configured to permit it. For example, if mysqld was started with –local-infile=0, LOCAL does not work. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.

这是MySQL出于安全考虑的默认配置。因此,我们需要在配置文件my.cnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/my.cnf中),确保:

local-infile=1

抑或是在命令行启动MySQL时加上–local-infile这一项:

mysql –local-infile -uroot -pyourpwd yourdbname

此外,我们也可以使用MySQL的一个官方导入程序mysqlimport ,这个程序本质上就是为LOAD DATA FILE提供了一个命令行的interface,很容易理解,我们这里指蔽亩就不再详述。

2. 将XML文件导入MySQL

这件事的完成方式,与我们的XML的形式有着很大的关系。

举个例子说,当你的XML数据文件有着很非常规范的格式,比如:

1

Free

.3333

2

Niki

.2333

或者

我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册–LOAD XML Syntax。

然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v5.0.7以后,MySQL的Stored Procedure中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procedure)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。

以下是一个示例XML文件和程序:

文件:

程序:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))

BEGIN

declare xml_content text;

declare v_row_index int unsigned default 0;

declare v_row_count int unsigned;

declare v_xpath_row varchar(255);

set xml_content = load_file(path);

calculate the number of row elements.

set v_row_count = extractValue(xml_content, concat(‘count(‘, node, ‘)’));

loop through all the row elements

while v_row_index

set v_row_index = v_row_index + 1;

set v_xpath_row = concat(node, ‘/@*’);

insert into applicants values (

extractValue(xml_content, concat(v_xpath_row, ”)),

extractValue(xml_content, concat(v_xpath_row, ”)),

extractValue(xml_content, concat(v_xpath_row, ”))

);

end while;

END

在MySQL中,使用它进行导入:

call import_some_xml(‘你的XML文件路径’, ‘/some_list/someone’);

程序相当的直白,只要了解一下MySQL的脚本编写即可。

这里提一下DELIMITER $$。我们知道MySQL的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。

3. 将ON文件导入MySQL

如何将ON文件导入MySQL中,是一个很有趣的话题。ON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。

很多时候,我们处理的ON数据是以如下形式出现的:

{“name”:”Julia”,”gender”:”female”}

{“name”:”Alice”,”gender”:”female”}

{“name”:”Bob”,”gender”:”male”}

{“name”:”Julian”,”gender”:”male”}

而并不是规整的(一些NoSQL数据库的Export)。

这样的形势对于载入有一个好处:因为每一行是一个ON Object,所以我们便可以按行处理此文件,而不需要因为ON的严格结构将整个文件(比如一个许多G的.json文件)全部载入。

方式一 使用common-schema

common-schema是一个应用很广泛的MySQL的框架,它有着很丰富的功能和详细的文档。我们可以使用它的ON解析的功能。(它还具有ON转换成XML等等方便的功能)

具体说来,将common-schema导入之后,使用它的extract_json_value函数即可。源码中:

create function extract_json_value(

json_text text charset utf8,

xpath text charset utf8

) returns text charset utf8

该函数接受两个参数,一个是json_text,表示json文件的内容,另一个是xpath,表示数据的结构(这里可以类比XML文件的处理)。很多读者应该知道,XPath是用来对XML中的元素进行定位的,这里也可以作一样的理解。

以本段开始的几行ON为例,这里common-schema的使用如下例:

select common_schema.extract_json_value(f.event_data,’/name’) as name, common_schema.extract_json_value(f.event_data,’/gender’) as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;

关于event_data,我们需要先理解LOAD DATA INFILE是一个event,不同的event type对应不同的event data。这部分知识可以参看Event Data for Specific Event Types

如果感兴趣,可以参看其源码。参看一个受到广泛使用的项目的源码,对于自身成长是很有益的。

当然了,我们也可以像之前处理XML文件导入一样,自己编写程序。这里便不再给出实例程序,有兴趣的读者可以自行编写或者跟笔者交流。

方式二 使用mysqljsonimport

这是Anders Karlsson的一个完成度很高的作品。这一份程序由C写成。它依赖于一个ON Parser,Jansson。他们都有着比较好的维护和文档,所以使用上体验很好。

mysqljsonimport的下载在SourceForge上。具体使用参照其文档即可。

为了方便不熟悉源码安装的朋友,笔者在这里提一下安装流程和注意事项。

安装命令顺序如下:

$ wget

$ tar xvfz mysqljsonimport-1.6.tar.gz

$ cd mysqljsonimport-1.6

$ ./configure –-with-mysql=//mysql

$ make

$ make check

$ sudo make install

–with-mysql这一步不是必要的,只要你安装的mysql的路径是系统的默认路径。很关键的,而且很容易被不熟悉的朋友忽略的是,这一个C程序要成功编译和运行,是需要MySQL的C API的,所以需要安装的依赖,除了jansson,还有libmysqlclient-dev。

jansson的安装就是简单的源码安装,libmysqlclient-dev则可以使用包管理工具(比如ubuntu中使用apt-get即可;编译和安装前,建议先sudo apt-get update以避免不必要的麻烦)。

导入命令:

$ ./mysqljsonimport –-database test –-table tablename jsonfilename

还有一个parser,作者是Kazuho,感兴趣的读者可以参看一下,他的相关博文是mysql_json – a MySQL UDF for parsing ON ,github项目是mysql_json。

4. 使用MySQL workbench

Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和ON文件。

具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。

文/freenik(简书作者)

原文链接:

关于c 上传xml文件然后导入到数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 快速简便的C语言上传XML文件并导入数据库方法 (c 上传xml文件然后导入到数据库)