APP下载

基于Qt的神通数据库与XML文件交互

2018-02-01姜家文韩耀斌贾壮

软件导刊 2018年1期
关键词:神通跨平台代码

姜家文+韩耀斌+贾壮

摘要:

国内外信息安全事件频发,为保障政府、国防、金融、电力、机要、保密等关键领域信息安全,软件国产化成为大势所趋。Qt开发工具开源跨平台;国产神通数据库兼容Oracle、移植性强;XML格式通用,为程序间数据交换必备,三者结合使软件国产化开发成为可能。阐述了Qt开发环境下神通数据库与xml文件的交互,给出部分代码,为国产软件开发者提供思路与解决方法。

关键词:

xml;神通数据库;Qt;软件开发交互

DOIDOI:10.11907/rjdk.172195

中图分类号:TP392

文献标识码:A文章编号文章编号:1672-7800(2018)001-0192-03

Abstract:With the domestic and international information security incidents frequently, in order to protect the government, defense, finance, electricity, confidential, confidential and other key areas of information security, software localization become the new trend. Qt development tools which is open source and cross-platform, Shentong database compatible with oracle and portability, XML (Extensible Markup Language) which is format common, and necessary at data exchanging between programs. It makes the localization of software development possible that the combination of the three. In this paper, based on Qt development environment, a brief introduction and some detailed code are given for interaction of Shentong database and xml file, which provideideas and solutions for domestic software developers.

Key Words:xml; Shentong database; Qt; software development; interaction

0引言

近年,国内外各种信息安全事件频发,特别是“棱镜门”事件给各国敲响了警钟。政府、国防、金融、电力、机要、保密等领域信息安全面临巨大威胁,在信息安全要求高的领域,采用国产软件成为大势所趋[1-4]。Qt作为一种强大开源跨平台开发工具成为国产软件首选开发工具。神通数据库作为国内知名有自主知识产权的大型通用关系型数据库,其对Oracle数据库强大兼容性与跨平台可移植性获得了国产软件开发者青睐。XML(Extensible Markup Language,可扩展标记语言)是一种置标语言,用于数据存储。XML虽然比二进制数据占用空间更多,但简单易掌握,成为程序间数据交换公共语言[5]。XML易与Windows、Linux及其它平台信息结合。通过加载XML数据,并可以XML格式输出结果,在不同程序间传递数据。XML由W3C制定,其标准化工作由W3C的XML工作组负责,作为一种共用格式该技术不会成为少数公司盈利工具,因此XML使用极其广泛。Qt、神通数据库、XML三者结合为软件国产化创造了条件。

利用Qt针对神通数据库进行开发,从神通数据库中读出相关数据,生成标准格式XML作为其它程序初始参数;其它程序生成标准XML也可通过该程序录入数据库保存,便于下一次使用,三者关系如图1所示。本文先介绍Qt开发环境、神通数据库及XML,再介绍Qt对神通数据库与XML的操作,最后给出Qt环境下神通数据库与XML交互过程。文中提供部分关键代码,为需要对神通

数据库与XML进行交互的开发者提供思路与解决方法。

1Qt与神通数据库

1.1Qt5.5

Qt是1991年奇趣科技开发的跨平台C++图形用户界面应用程序开发框架[6-7]。它可开发GUI程序或非GUI程序。Qt是面向对象的框架,使用特殊代码生成扩展以及一些宏,易于扩展,允许组件编程。Qt作为开发工具功能强大,许多著名软件如Opera浏览器、Skype、Google地球等都由Qt开发。Qt有开源版本并支持跨平台运行,一次开发几乎不需改动即能在Windows与麒麟下编译运行,为程序过渡创造条件。本文使用Linux Red-hat开源版Qt5.5,采用可视化编程模式。网上可下载到2种安装包,一种是源代码版,安装前需自己编译,好处是可根据需要进行适当设置;另一种是已编译好直接安装,但安装过程不可编辑,建议对Linux系统不熟悉的用户使用后者。Qt5相对Qt4改进较大,Qt4运行Qt5代码会出错,且Qt4部分代码Qt5不再支持,因此团队开发应注意使用同一版本Qt。

1.2神通数据库

神通数据库是一款国产计算机数据库,提供大型关系型数据库通用功能,具有丰富数据类型、多种索引类型、存储过程、触发器、内置函数、视图、Package、行级锁、完整性约束、多种隔离级别、在线备份、支持事务处理等通用特性[8]。系統支持SQL通用数据库查询语言,提供多种标准数据访问接口,便于开发编程;兼容Oracle数据库,便于移植。本文使用神通数据库管理系统7.0。数据库必须在root管理员账户下安装,否则创建数据库时会出错。安装后,可在普通账户下使用,但涉及备份、迁移等敏感权限时仍需在root管理员账户下操作。endprint

1.3QODBC與神通数据库连接

数据库提供标准ODBC、JDBC、OLEDB/ADO、NET Framework、ACI等多种数据访问接口。本文采用QODBC连接,即安装unixodbc驱动,配置Qt与odbc链接,与数据库建立一对一DSNs链接,就可使用Qt提供的QtSql相关类进行神通数据库开发,降低开发难度与程序复杂程度。

使用Qt的QtSql相关类进行数据库操作,需链接到sql模块,即在qmake项目文件.pro中添加如下代码:

QT+=sql

使用相应模块头文件必须包含:

#include

#include

程序数据库连接代码如下:

QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");

db.setDatabaseName("odsn");

db.setUserName("sysdba");

db.setPassword("szoscar55");

db.open();

2Qt与XML

2.1Qt处理XML方法

XML较强扩展性与通用性是基于自身稳定严格的基础规则。下面给出一个标准XML案例,后文开发实例均是关于对该案例的处理。

<?xml version=“1.0” encoding=“UTF-8”?>length

10

cmwidth

5

cmheight

6

cm

对于一般XML数据处理,Qt提供了QtXML模块,可直接调用其提供函数,极大减轻编程负担。Qt提供了3种不同应用程序接口来读取XML文档[9]:①文档对象模型(DOM),将XML文档转为应用程序可遍历属性结构,优点是可以任意顺序遍历XML文档树形表示,并可用于多通道解法;②QXmlStream,用于读取格式良好XML文档的快速解析器,该类最快且最易使用,并提供了兼容其它Qt的应用程序编程接口,适合编写单通道解析器;③XML简单应用程序编程接口(SAX),通过虚函数直接向应用程序报告解析事件。

3种模式各有利弊。DOM每一个子对象与XML每一个子节点对应,保留了相同层次结构,能够随机访问XML中节点,但缺点是需将整个XML文件加载到内存,不适合处理较大文件。QXmlStream按阶段将文档读取到内存,通过readNext()读入一个节点,然后判断节点内容,用不同函数处理不同节点,能处理很大XML文件,但代码与实现方式比第一种复杂。SAX与QXmlStreamReader类似,按节点顺序读取,但处理方法不同,需调用已写好回调函数,且该函数为虚函数,不能改变名字,只能根据传入参数实现不同处理,代码复杂,较少使用。

XML属于一种可用文本编辑器编写的标记语言,可直接在Qt中利用字符串拼接(QString)生成XML文档,并对字符串进行创建与修改,实现对XML的生成与修改(需注意特殊符号<、>、&的转义)。该方式灵活性强,可处理非标准格式XML,但代码复杂易出错,不推荐使用。本文采用文档对象模型(DOM)方法处理XML。

2.2DOM方法处理XML

使用Qt中DOM相关类进行XML处理,需连接QtXML模块,即在qmake项目文件.pro种添加:

QT+=xml

使用相应模块头文件必须包含:

#include

DOM定义了访问与操作XML文档标准方法,将XML文档作为树结构查看,可通过DOM树访问所有元素及修改或删除内容,并创建新元素。QDomDocument类表示整个XML文档,为文档树的根,并提供对文档树主要访问。因为元素、文本节点、注释、处理指令等不能存在于文档上下文之外,则文档类还应包含上述对象的函数,如QDomNode表示节点、QDomElement表示元素等。下面给出新建与读取XML代码:

QDomDocument doc;

QDomProcessingInstruction i=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");

doc.appendChild(i);

QDomElement root=doc.createElement("ParamAppoInfo");

doc.appendChild(root);

QString A[]={"ParamName","Value","Unit"};

QString M[]={"length","10","cm","witdth","5","cm","height","6","cm"};

for (int j=0;j<3;j++)

{

QDomElement aa=doc.createElement("Parameter");

root.appendChild(aa);

for(int i=1;i<=3;i++)

{

QDomElement bb=doc.createElement(A[i-1]);

aa.appendChild(bb);

QDomText cc=doc.createTextNode(M[i+j*3]);

bb.appendChild(cc);

}

}

QFile file(filename);

if (!file.open(QIODevice::WriteOnly | QIODevice::

Truncate |QIODevice::Text))

return;

QTextStream out(&file);

out.setCodec("UTF-8");

doc.save(out,4,QDomNode::EncodingFromTextStream);

file.close();

根据程序不同需求,读取XML方法有多种。从读取内容可分为有节点、节点下的值、属性等;从读取方式可分为将所有值都分别读出,按节点将值读出等。这里按节点顺序将元素中每个值取出写进一个字符数组M,关键代码如下:

QDomDocument doc;

doc.setContent(&file);

QDomElement root=doc.documentElement();

QDomNode n=root.firstChild();

QString M[100];

int j=0;

while(!n.isNull())

{

QDomElement e=n.toElement();

QDomNodeList list=e.childNodes();

QDomNode t;

for(int i=0;i

{

t=list.at(i);

if(t.isElement())

{

M[i+j*list.count()]=t.toElement().text();

}

}

j++;

n=n.nextSibling();

}

若XML文档较大,DOM树最终可能会占用大量内存。对于此类文档,QXmlStreamReader类可能是更好解决方案。不过上述方法是适用于大多数XML处理,因为其主要用于程序间参数传递,而非数据保存。

3神通数据库与XML的简单交互

根据XML文件,在神通数据库中“TEST”模式下建立一个名为“长方体”的表,如圖2所示,共有3列,分别代表“ParamName”、“Value”、“Unit”,数据共3行,分别将XML各节点值填入,即相应长宽高。神通数据库与XML的交互,是指将XML各节点值录入数据库,同时能读取数据库生成XML。实现这个过程需用到SQL(Structured Query Language)语句,即结构化查询语言。读取数据时,使用“SELECT”语句,录入时使用“INSERT INTO”语句[10]。通过QODBC可使神通数据库直接运行SQL语句,注意SQL语句语法格式。

读取数据库关键代码如下(sql字符串中注意转义字符“\”使用),最后得到以M字符数组为顺序的XML每个节点值:

QString sql=" select*from \"测试\".\"长方体\"";

QSqlQuery query;

query.exec(sql);

int c=1;

int num=0;

while (query.next())

{

for(int i=0;i<=14;i++)

{

M[c]=query.value(i).toString();

c++;

}

}

录入数据库时,为简化程序,写入前先处理得到的XML字符数组,一次插入一行。写入数据库时需注意SQL语句语法,特别是转义字符与半角逗号的使用。写入数据库关键代码如下:

for(int i=0;i<3;i++)

{

MM[j]=MM[j]+ " ' " +M[i+j*3]+ " ' " + ",";

}

int length=M[j].length();

M[j].remove(length-1,length);

for(int i=0;i<3;i++)

{

QString sql="insert into "+ " \"TEST\".\"长方体\"" + " values (" + MM[i] + ")";

QSqlQuery query;

query.exec(sql);

}

上面2段代码实现了数据库与XML的简单交互。对数据库进行操作前,需如上文所给代码利用QODBC将其打开。

4结语

XML简单易用特性使其成为数据交换唯一公共语言,越来越多应用于各类程序开发;Qt作为一种跨平台、开源可视化编程工具,越来越受欢迎;神通数据库作为国产数据库翘楚,成为国产软件开发者首选。本文阐述了Qt开发环境下神通数据库与XML文件的交互,介绍了从神通数据库读取相关数据,生成标准格式XML录入数据库保存的方法并给出关键代码,为需要进行神通数据库与XML交互的开发者提供思路与解决办法。

参考文献:

[1]PIERSON G,DEHAAN J.Network security and fraud detection system and method[P].U.S.,9203837,2015-12-01.

[2]YAN J, HE H, SUN Y. Integrated security analysis on cascading failure in complex networks[J]. IEEE Transactions on Information Forensics and Security,2014,9(3):451-463.

[3]冯登国,张阳,张玉清.信息安全风险评估综述[J].通信学报,2004,25(7):10-18.

[4]彭珺,高珺.计算机网络信息安全及防护策略研究[J].计算机与数字工程,2011,39(1):121-124.

[5]亨特,拉夫特,福特斯,等.XML入门经典[M].吴文国,译.北京:清华大学出版社,2013.

[6]陆文周.Qt5開发及实例[M].青岛:电子工业出版社,2014.

[7]霍亚飞,程梁.Qt 5编程入门[M].北京:北京航空航天大学出版社,2015.

[8]何清法,王澍丰,顾云苏.国产神通数据库教程[M].西安:西安交通大学出版社,2012.

[9]霍亚飞.QtCreator快速入门[M].北京:北京航空航天大学出版社,2013.

[10]威尔顿,科尔比.SQL入门经典[M].敖富江,译.北京:清华大学出版社,2006.

(责任编辑:何丽)endprint

猜你喜欢

神通跨平台代码
跨平台APEX接口组件的设计与实现
创世代码
创世代码
创世代码
创世代码
神通扭不过大势至
陈思照:音乐可让两岸神通意会
基于QT的跨平台输电铁塔监控终端软件设计与实现
基于OPC跨平台通信的电机监测与诊断系统
基于B/S的跨平台用户界面可配置算法研究