姜家文+韓耀斌+賈壯


摘要:
國(guó)內(nèi)外信息安全事件頻發(fā),為保障政府、國(guó)防、金融、電力、機(jī)要、保密等關(guān)鍵領(lǐng)域信息安全,軟件國(guó)產(chǎn)化成為大勢(shì)所趨。Qt開發(fā)工具開源跨平臺(tái);國(guó)產(chǎn)神通數(shù)據(jù)庫(kù)兼容Oracle、移植性強(qiáng);XML格式通用,為程序間數(shù)據(jù)交換必備,三者結(jié)合使軟件國(guó)產(chǎn)化開發(fā)成為可能。闡述了Qt開發(fā)環(huán)境下神通數(shù)據(jù)庫(kù)與xml文件的交互,給出部分代碼,為國(guó)產(chǎn)軟件開發(fā)者提供思路與解決方法。
關(guān)鍵詞:
xml;神通數(shù)據(jù)庫(kù);Qt;軟件開發(fā)交互
DOIDOI:10.11907/rjdk.172195
中圖分類號(hào):TP392
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):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引言
近年,國(guó)內(nèi)外各種信息安全事件頻發(fā),特別是“棱鏡門”事件給各國(guó)敲響了警鐘。政府、國(guó)防、金融、電力、機(jī)要、保密等領(lǐng)域信息安全面臨巨大威脅,在信息安全要求高的領(lǐng)域,采用國(guó)產(chǎn)軟件成為大勢(shì)所趨[1-4]。Qt作為一種強(qiáng)大開源跨平臺(tái)開發(fā)工具成為國(guó)產(chǎn)軟件首選開發(fā)工具。神通數(shù)據(jù)庫(kù)作為國(guó)內(nèi)知名有自主知識(shí)產(chǎn)權(quán)的大型通用關(guān)系型數(shù)據(jù)庫(kù),其對(duì)Oracle數(shù)據(jù)庫(kù)強(qiáng)大兼容性與跨平臺(tái)可移植性獲得了國(guó)產(chǎn)軟件開發(fā)者青睞。XML(Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言)是一種置標(biāo)語(yǔ)言,用于數(shù)據(jù)存儲(chǔ)。XML雖然比二進(jìn)制數(shù)據(jù)占用空間更多,但簡(jiǎn)單易掌握,成為程序間數(shù)據(jù)交換公共語(yǔ)言[5]。XML易與Windows、Linux及其它平臺(tái)信息結(jié)合。通過加載XML數(shù)據(jù),并可以XML格式輸出結(jié)果,在不同程序間傳遞數(shù)據(jù)。XML由W3C制定,其標(biāo)準(zhǔn)化工作由W3C的XML工作組負(fù)責(zé),作為一種共用格式該技術(shù)不會(huì)成為少數(shù)公司盈利工具,因此XML使用極其廣泛。Qt、神通數(shù)據(jù)庫(kù)、XML三者結(jié)合為軟件國(guó)產(chǎn)化創(chuàng)造了條件。
利用Qt針對(duì)神通數(shù)據(jù)庫(kù)進(jìn)行開發(fā),從神通數(shù)據(jù)庫(kù)中讀出相關(guān)數(shù)據(jù),生成標(biāo)準(zhǔn)格式XML作為其它程序初始參數(shù);其它程序生成標(biāo)準(zhǔn)XML也可通過該程序錄入數(shù)據(jù)庫(kù)保存,便于下一次使用,三者關(guān)系如圖1所示。本文先介紹Qt開發(fā)環(huán)境、神通數(shù)據(jù)庫(kù)及XML,再介紹Qt對(duì)神通數(shù)據(jù)庫(kù)與XML的操作,最后給出Qt環(huán)境下神通數(shù)據(jù)庫(kù)與XML交互過程。文中提供部分關(guān)鍵代碼,為需要對(duì)神通
數(shù)據(jù)庫(kù)與XML進(jìn)行交互的開發(fā)者提供思路與解決方法。
1Qt與神通數(shù)據(jù)庫(kù)
1.1Qt5.5
Qt是1991年奇趣科技開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架[6-7]。它可開發(fā)GUI程序或非GUI程序。Qt是面向?qū)ο蟮目蚣?,使用特殊代碼生成擴(kuò)展以及一些宏,易于擴(kuò)展,允許組件編程。Qt作為開發(fā)工具功能強(qiáng)大,許多著名軟件如Opera瀏覽器、Skype、Google地球等都由Qt開發(fā)。Qt有開源版本并支持跨平臺(tái)運(yùn)行,一次開發(fā)幾乎不需改動(dòng)即能在Windows與麒麟下編譯運(yùn)行,為程序過渡創(chuàng)造條件。本文使用Linux Red-hat開源版Qt5.5,采用可視化編程模式。網(wǎng)上可下載到2種安裝包,一種是源代碼版,安裝前需自己編譯,好處是可根據(jù)需要進(jìn)行適當(dāng)設(shè)置;另一種是已編譯好直接安裝,但安裝過程不可編輯,建議對(duì)Linux系統(tǒng)不熟悉的用戶使用后者。Qt5相對(duì)Qt4改進(jìn)較大,Qt4運(yùn)行Qt5代碼會(huì)出錯(cuò),且Qt4部分代碼Qt5不再支持,因此團(tuán)隊(duì)開發(fā)應(yīng)注意使用同一版本Qt。
1.2神通數(shù)據(jù)庫(kù)
神通數(shù)據(jù)庫(kù)是一款國(guó)產(chǎn)計(jì)算機(jī)數(shù)據(jù)庫(kù),提供大型關(guān)系型數(shù)據(jù)庫(kù)通用功能,具有豐富數(shù)據(jù)類型、多種索引類型、存儲(chǔ)過程、觸發(fā)器、內(nèi)置函數(shù)、視圖、Package、行級(jí)鎖、完整性約束、多種隔離級(jí)別、在線備份、支持事務(wù)處理等通用特性[8]。系統(tǒng)支持SQL通用數(shù)據(jù)庫(kù)查詢語(yǔ)言,提供多種標(biāo)準(zhǔn)數(shù)據(jù)訪問接口,便于開發(fā)編程;兼容Oracle數(shù)據(jù)庫(kù),便于移植。本文使用神通數(shù)據(jù)庫(kù)管理系統(tǒng)7.0。數(shù)據(jù)庫(kù)必須在root管理員賬戶下安裝,否則創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)出錯(cuò)。安裝后,可在普通賬戶下使用,但涉及備份、遷移等敏感權(quán)限時(shí)仍需在root管理員賬戶下操作。endprint
1.3QODBC與神通數(shù)據(jù)庫(kù)連接
數(shù)據(jù)庫(kù)提供標(biāo)準(zhǔn)ODBC、JDBC、OLEDB/ADO、NET Framework、ACI等多種數(shù)據(jù)訪問接口。本文采用QODBC連接,即安裝unixodbc驅(qū)動(dòng),配置Qt與odbc鏈接,與數(shù)據(jù)庫(kù)建立一對(duì)一DSNs鏈接,就可使用Qt提供的QtSql相關(guān)類進(jìn)行神通數(shù)據(jù)庫(kù)開發(fā),降低開發(fā)難度與程序復(fù)雜程度。
使用Qt的QtSql相關(guān)類進(jìn)行數(shù)據(jù)庫(kù)操作,需鏈接到sql模塊,即在qmake項(xiàng)目文件.pro中添加如下代碼:
QT+=sql
使用相應(yīng)模塊頭文件必須包含:
#include
#include
程序數(shù)據(jù)庫(kù)連接代碼如下:
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("odsn");
db.setUserName("sysdba");
db.setPassword("szoscar55");
db.open();
2Qt與XML
2.1Qt處理XML方法
XML較強(qiáng)擴(kuò)展性與通用性是基于自身穩(wěn)定嚴(yán)格的基礎(chǔ)規(guī)則。下面給出一個(gè)標(biāo)準(zhǔn)XML案例,后文開發(fā)實(shí)例均是關(guān)于對(duì)該案例的處理。
<?xml version=“1.0” encoding=“UTF-8”?>
對(duì)于一般XML數(shù)據(jù)處理,Qt提供了QtXML模塊,可直接調(diào)用其提供函數(shù),極大減輕編程負(fù)擔(dān)。Qt提供了3種不同應(yīng)用程序接口來讀取XML文檔[9]:①文檔對(duì)象模型(DOM),將XML文檔轉(zhuǎn)為應(yīng)用程序可遍歷屬性結(jié)構(gòu),優(yōu)點(diǎn)是可以任意順序遍歷XML文檔樹形表示,并可用于多通道解法;②QXmlStream,用于讀取格式良好XML文檔的快速解析器,該類最快且最易使用,并提供了兼容其它Qt的應(yīng)用程序編程接口,適合編寫單通道解析器;③XML簡(jiǎn)單應(yīng)用程序編程接口(SAX),通過虛函數(shù)直接向應(yīng)用程序報(bào)告解析事件。
3種模式各有利弊。DOM每一個(gè)子對(duì)象與XML每一個(gè)子節(jié)點(diǎn)對(duì)應(yīng),保留了相同層次結(jié)構(gòu),能夠隨機(jī)訪問XML中節(jié)點(diǎn),但缺點(diǎn)是需將整個(gè)XML文件加載到內(nèi)存,不適合處理較大文件。QXmlStream按階段將文檔讀取到內(nèi)存,通過readNext()讀入一個(gè)節(jié)點(diǎn),然后判斷節(jié)點(diǎn)內(nèi)容,用不同函數(shù)處理不同節(jié)點(diǎn),能處理很大XML文件,但代碼與實(shí)現(xiàn)方式比第一種復(fù)雜。SAX與QXmlStreamReader類似,按節(jié)點(diǎn)順序讀取,但處理方法不同,需調(diào)用已寫好回調(diào)函數(shù),且該函數(shù)為虛函數(shù),不能改變名字,只能根據(jù)傳入?yún)?shù)實(shí)現(xiàn)不同處理,代碼復(fù)雜,較少使用。
XML屬于一種可用文本編輯器編寫的標(biāo)記語(yǔ)言,可直接在Qt中利用字符串拼接(QString)生成XML文檔,并對(duì)字符串進(jìn)行創(chuàng)建與修改,實(shí)現(xiàn)對(duì)XML的生成與修改(需注意特殊符號(hào)<、>、&的轉(zhuǎn)義)。該方式靈活性強(qiáng),可處理非標(biāo)準(zhǔn)格式XML,但代碼復(fù)雜易出錯(cuò),不推薦使用。本文采用文檔對(duì)象模型(DOM)方法處理XML。
2.2DOM方法處理XML
使用Qt中DOM相關(guān)類進(jìn)行XML處理,需連接QtXML模塊,即在qmake項(xiàng)目文件.pro種添加:
QT+=xml
使用相應(yīng)模塊頭文件必須包含:
#include
DOM定義了訪問與操作XML文檔標(biāo)準(zhǔn)方法,將XML文檔作為樹結(jié)構(gòu)查看,可通過DOM樹訪問所有元素及修改或刪除內(nèi)容,并創(chuàng)建新元素。QDomDocument類表示整個(gè)XML文檔,為文檔樹的根,并提供對(duì)文檔樹主要訪問。因?yàn)樵亍⑽谋竟?jié)點(diǎn)、注釋、處理指令等不能存在于文檔上下文之外,則文檔類還應(yīng)包含上述對(duì)象的函數(shù),如QDomNode表示節(jié)點(diǎn)、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();
根據(jù)程序不同需求,讀取XML方法有多種。從讀取內(nèi)容可分為有節(jié)點(diǎn)、節(jié)點(diǎn)下的值、屬性等;從讀取方式可分為將所有值都分別讀出,按節(jié)點(diǎn)將值讀出等。這里按節(jié)點(diǎn)順序?qū)⒃刂忻總€(gè)值取出寫進(jìn)一個(gè)字符數(shù)組M,關(guān)鍵代碼如下:
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樹最終可能會(huì)占用大量?jī)?nèi)存。對(duì)于此類文檔,QXmlStreamReader類可能是更好解決方案。不過上述方法是適用于大多數(shù)XML處理,因?yàn)槠渲饕糜诔绦蜷g參數(shù)傳遞,而非數(shù)據(jù)保存。 3神通數(shù)據(jù)庫(kù)與XML的簡(jiǎn)單交互 根據(jù)XML文件,在神通數(shù)據(jù)庫(kù)中“TEST”模式下建立一個(gè)名為“長(zhǎng)方體”的表,如圖2所示,共有3列,分別代表“ParamName”、“Value”、“Unit”,數(shù)據(jù)共3行,分別將XML各節(jié)點(diǎn)值填入,即相應(yīng)長(zhǎng)寬高。神通數(shù)據(jù)庫(kù)與XML的交互,是指將XML各節(jié)點(diǎn)值錄入數(shù)據(jù)庫(kù),同時(shí)能讀取數(shù)據(jù)庫(kù)生成XML。實(shí)現(xiàn)這個(gè)過程需用到SQL(Structured Query Language)語(yǔ)句,即結(jié)構(gòu)化查詢語(yǔ)言。讀取數(shù)據(jù)時(shí),使用“SELECT”語(yǔ)句,錄入時(shí)使用“INSERT INTO”語(yǔ)句[10]。通過QODBC可使神通數(shù)據(jù)庫(kù)直接運(yùn)行SQL語(yǔ)句,注意SQL語(yǔ)句語(yǔ)法格式。 讀取數(shù)據(jù)庫(kù)關(guān)鍵代碼如下(sql字符串中注意轉(zhuǎn)義字符“\”使用),最后得到以M字符數(shù)組為順序的XML每個(gè)節(jié)點(diǎn)值: QString sql=" select*from \"測(cè)試\".\"長(zhǎng)方體\""; 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++; } } 錄入數(shù)據(jù)庫(kù)時(shí),為簡(jiǎn)化程序,寫入前先處理得到的XML字符數(shù)組,一次插入一行。寫入數(shù)據(jù)庫(kù)時(shí)需注意SQL語(yǔ)句語(yǔ)法,特別是轉(zhuǎn)義字符與半角逗號(hào)的使用。寫入數(shù)據(jù)庫(kù)關(guān)鍵代碼如下: 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\".\"長(zhǎng)方體\"" + " values (" + MM[i] + ")"; QSqlQuery query; query.exec(sql); }
上面2段代碼實(shí)現(xiàn)了數(shù)據(jù)庫(kù)與XML的簡(jiǎn)單交互。對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作前,需如上文所給代碼利用QODBC將其打開。
4結(jié)語(yǔ)
XML簡(jiǎn)單易用特性使其成為數(shù)據(jù)交換唯一公共語(yǔ)言,越來越多應(yīng)用于各類程序開發(fā);Qt作為一種跨平臺(tái)、開源可視化編程工具,越來越受歡迎;神通數(shù)據(jù)庫(kù)作為國(guó)產(chǎn)數(shù)據(jù)庫(kù)翹楚,成為國(guó)產(chǎn)軟件開發(fā)者首選。本文闡述了Qt開發(fā)環(huán)境下神通數(shù)據(jù)庫(kù)與XML文件的交互,介紹了從神通數(shù)據(jù)庫(kù)讀取相關(guān)數(shù)據(jù),生成標(biāo)準(zhǔn)格式XML錄入數(shù)據(jù)庫(kù)保存的方法并給出關(guān)鍵代碼,為需要進(jìn)行神通數(shù)據(jù)庫(kù)與XML交互的開發(fā)者提供思路與解決辦法。
參考文獻(xiàn):
[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]馮登國(guó),張陽(yáng),張玉清.信息安全風(fēng)險(xiǎn)評(píng)估綜述[J].通信學(xué)報(bào),2004,25(7):10-18.
[4]彭珺,高珺.計(jì)算機(jī)網(wǎng)絡(luò)信息安全及防護(hù)策略研究[J].計(jì)算機(jī)與數(shù)字工程,2011,39(1):121-124.
[5]亨特,拉夫特,福特斯,等.XML入門經(jīng)典[M].吳文國(guó),譯.北京:清華大學(xué)出版社,2013.
[6]陸文周.Qt5開發(fā)及實(shí)例[M].青島:電子工業(yè)出版社,2014.
[7]霍亞飛,程梁.Qt 5編程入門[M].北京:北京航空航天大學(xué)出版社,2015.
[8]何清法,王澍豐,顧云蘇.國(guó)產(chǎn)神通數(shù)據(jù)庫(kù)教程[M].西安:西安交通大學(xué)出版社,2012.
[9]霍亞飛.QtCreator快速入門[M].北京:北京航空航天大學(xué)出版社,2013.
[10]威爾頓,科爾比.SQL入門經(jīng)典[M].敖富江,譯.北京:清華大學(xué)出版社,2006.
(責(zé)任編輯:何麗)endprint