一、JDOM介紹
我們知道DOM是用于與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn),利用DOM和SAX API可以解析和處理XML文檔。這里我們介紹的JDOM是基于樹(shù)操作的純JAVA API,應(yīng)該說(shuō)它提供的是一套用于解析、創(chuàng)建、處理和實(shí)現(xiàn)XML的解決方案。這些API比DOM和SAX API提供的方法更為直觀,對(duì)于有JAVA經(jīng)驗(yàn)的程序員將會(huì)發(fā)現(xiàn)JDOM非常容易掌握。JDOM處理XML的方式比DOM容易的多,并且它的功能比使用SAX更加強(qiáng)大。
JDOM的內(nèi)部邏輯結(jié)構(gòu)基本上與DOM的相同,比如具有Document、Element、Comment等文檔節(jié)點(diǎn)類(lèi)型,其中每一個(gè)JDOM文檔必須有一個(gè)Document節(jié)點(diǎn),并且為節(jié)點(diǎn)樹(shù)的根節(jié)點(diǎn)。該根節(jié)點(diǎn)可以有子節(jié)點(diǎn)或者葉子節(jié)點(diǎn)如Comment、Text等。JDOM文檔中的每一個(gè)節(jié)點(diǎn)類(lèi)型均對(duì)應(yīng)格式良好的XML文當(dāng)中的沒(méi)一個(gè)元素。這也就為我們利用JDOM轉(zhuǎn)換數(shù)據(jù)庫(kù)到XML文檔提供了可操作的依據(jù)。
JDOM的優(yōu)點(diǎn):
由JDOM的文檔聲明我們將會(huì)很明顯的看出應(yīng)用JDOM的優(yōu)勢(shì)所在。JDOM文檔聲明如下“JDOM引用了20/80原則,即使用20%的精力解決80%的JAVA/XML問(wèn)題”。
● JDOM是用JAVA開(kāi)發(fā)并為JAVA提供服務(wù)的,它沿用了JAVA代碼的規(guī)范和類(lèi)庫(kù);
● 在眾多編程語(yǔ)言中,JAVA是使用XML的優(yōu)秀平臺(tái),XML又是JAVA應(yīng)用的優(yōu)秀數(shù)據(jù)表示方法。JDOM API是純JAVA API對(duì)于JAVA開(kāi)發(fā)人員來(lái)說(shuō)更容易上手;
● JDOM API比DOM所提供的方法更為直觀,同時(shí)簡(jiǎn)化了與XML的交互。比使用DOM更快。
org.jdom是用于JAVA API操作的JDOM工具包。
在org.jdom中,提供了Document、Element 、Comment 、DocType、Attribute、Text等存 JAVA 類(lèi),這些類(lèi)均是訪問(wèn)和操作JDOM文檔所必須的。我們可以利用這些類(lèi)創(chuàng)建、遍歷、修改JDOM文檔。
在org.jdom.output中,提供了DOMOutputter、XMLOutputter,用于處理JDOM樹(shù)的DOM樹(shù)形式、XML文檔形式輸出、打印等。
二、環(huán)境配置
在我的WINDOWS2000系統(tǒng)平臺(tái)上采用TOMCAT4.1.18、JDK1.4.0_02作為開(kāi)發(fā)和測(cè)試平臺(tái)。
通過(guò)“我的電腦”的“高級(jí)”屬性添加如下兩個(gè)環(huán)境設(shè)置CLASSPATH設(shè)置為:“.;c:\j2sdk1.4.0_02\lib\dt.jar;c:\j2sdk1.4.0_02\lib\tools.jar;”。PATH設(shè)置為“.;c:\j2sdk1.4.0_02\bin;”。
SQL SERVER JDBC驅(qū)動(dòng):mssqlserver.jar 放入TOMCAT的LIB目錄下。
三、獲得與安裝JDOM
由于目前JDOM并沒(méi)有包含在SUN的JDK中(我想不久的將來(lái)JDOM必然會(huì)成為SUN JDK的一部分),我們必須手工下載與設(shè)置JDOM的環(huán)境。
在http://www.jdom.org可以下載JDOM的最新版本。這里下載的是JDOM beta8。下載jdom-b8.zip后解壓縮,JDOM的jar文件就是build目錄下的文件jdom.jar,將上述文件拷貝到J2SDK1.4.0_02目錄下的jre/lib/ext目錄下。
四、利用JDOM實(shí)現(xiàn)SQL SERVER 數(shù)據(jù)庫(kù)到XML的轉(zhuǎn)換
1、數(shù)據(jù)庫(kù)、表的創(chuàng)建
這里應(yīng)用一個(gè)轉(zhuǎn)換顧客信息的例子——“顧客基本信息”。我們是把數(shù)據(jù)放置于MICROSOFT SQL SERVER 2000數(shù)據(jù)庫(kù)中,然后運(yùn)用JSP和JDOM技術(shù)動(dòng)態(tài)生成XML實(shí)例文檔。
我們事先Microsoft SQL Server數(shù)據(jù)庫(kù)CUSTOM中創(chuàng)建了一個(gè)數(shù)據(jù)表--CUSTOM,其數(shù)據(jù)結(jié)構(gòu)如下表所示:
字段名
注釋
類(lèi)型
是否為空
Name
姓名
varchar(12)
NOT NULL
ID
ID
int
NOT NULL
Company
公司
varchar(30)
NOT NULL
Email
TEL
varchar(15)
NOT NULL
往數(shù)據(jù)庫(kù)中輸入以下幾條記錄:
Name
ID
Company
Email
劉氏
001
公司1
liu@yantai.com
蔣氏
002
公司2
jiang@yantai.net
2、數(shù)據(jù)源設(shè)置
數(shù)據(jù)源(ODBC Source)實(shí)際上就是定義數(shù)據(jù)的來(lái)源。數(shù)據(jù)源的設(shè)置方法是: [開(kāi)始]-〉[設(shè)置]-〉[控制面板]-〉[管理工具]-〉[數(shù)據(jù)源(odbc)]-〉[System DSN]->[add]->[SQL Server],分別配置服務(wù)器名(CUSTOM所在服務(wù)器)、數(shù)據(jù)庫(kù)名(CUSTOM)、數(shù)據(jù)源名稱(chēng)(此處定為DB_CUSTOM)、用戶(hù)名(lgz)、用戶(hù)口令(空),數(shù)據(jù)源就配置好了。
3、代碼的編寫(xiě)
下面開(kāi)始我們的編寫(xiě)JSP代碼轉(zhuǎn)換工作,代碼將通過(guò)調(diào)用JDOM動(dòng)態(tài)生成XML結(jié)構(gòu),然后借助JDBC訪問(wèn)SQL SERVER數(shù)據(jù)庫(kù)動(dòng)態(tài)填充XML內(nèi)容。
<%@page contentType="text/html;charset=GBK"%>
<HTML>
<HEAD>
<TITLE>用JDOM實(shí)現(xiàn)數(shù)據(jù)庫(kù)到XML的轉(zhuǎn)換</TITLE>
</HEAD>
<BODY>
<%@page import="org.jdom.*"%>
<%@page import="java.*"%>
<%
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://10.40.14.54:1433;DatabaseName=DB_CUSTOM";
//載入jdbc odbc的驅(qū)動(dòng)程序
String user="lgz";
String password="lgz";
Connection conn= DriverManager.getConnection(url,user,password); //連接數(shù)據(jù)庫(kù)
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//創(chuàng)建一個(gè)statement
String sql="select * from client"; //定義查詢(xún)的SQL語(yǔ)句
ResultSet rs=stmt.executeQuery(sql); //執(zhí)行查詢(xún)
Document document=new Document(new Element("聯(lián)系人列表"));//創(chuàng)建文檔
ResultSetMetaData rsmd = rs.getMetaData(); //獲取字段名
int numberOfColumns = rsmd.getColumnCount(); //獲取字段數(shù)
int i=0;
while(rs.next()){ //將查詢(xún)結(jié)果取出
Element element0=new Element("聯(lián)系人"); //創(chuàng)建元素 生成JDOM樹(shù)
document.getRootElement().addContent(element0);
for (i=1; i<=numberOfColumns;i++)
{ String date=new String(rs.getString(i).getBytes("ISO-8859-1"),"gb2312"); //代碼轉(zhuǎn)換
Element element=new Element(rsmd.getColumnName(i)).setText(date);
element0.addContent(element);
}
}
rs.close(); //關(guān)閉結(jié)果集
stmt.close(); //關(guān)閉statement
conn.close(); //關(guān)閉連接
XMLOutputter outp = new XMLOutputter();
outp.output(document, new FileOutputStream("d:\\data.xml")); //輸出XML文檔
out.print("XML 文檔生成完畢!");
%>
<a href="file:///d|/data.xml">點(diǎn)擊打開(kāi)產(chǎn)生的XML文檔 </a>
</BODY>
</HTML>
4、程序的運(yùn)行
通過(guò)瀏覽器的8080端口運(yùn)行該JSP,將產(chǎn)生預(yù)期的xml文件。
五、應(yīng)用分析
XML作為數(shù)據(jù)交換的標(biāo)準(zhǔn),得到了越來(lái)越廣泛的應(yīng)用。這篇文章闡明了數(shù)據(jù)庫(kù)到XML轉(zhuǎn)換的基本方法,從而使各異構(gòu)平臺(tái)以及各種格式的數(shù)據(jù)進(jìn)行數(shù)據(jù)交換成為可能。當(dāng)我們能夠把原始的數(shù)據(jù)轉(zhuǎn)化為XML格式化的形式,就能夠以豐富的HTML的格式表示出來(lái)。這里列舉兩個(gè)方面的應(yīng)用:
1、 XML應(yīng)用服務(wù)器:
XML應(yīng)用服務(wù)器實(shí)際上是支持XML的Web應(yīng)用服務(wù)器,它們通常是模板驅(qū)動(dòng)的,通過(guò)在一個(gè)劇本語(yǔ)言中嵌入使用SQL語(yǔ)句來(lái)提取數(shù)據(jù)并動(dòng)態(tài)構(gòu)建XML文檔。
2、 基于XML的桌面應(yīng)用
我們知道通過(guò)XSL可以把相同的數(shù)據(jù)以不同的數(shù)據(jù)形式提交給終端客戶(hù),一個(gè)XSL文件描述了數(shù)據(jù)的顯示方式,你可以把許多XSL和同一個(gè)XML文檔相連來(lái)提供不同的基于HTML的表示,這樣事實(shí)上,我們就可以建立基于XML的桌面應(yīng)用程序
采用這種方法主要有兩個(gè)優(yōu)點(diǎn),首先,你可以以平臺(tái)和語(yǔ)言獨(dú)立的方式來(lái)操作數(shù)據(jù),其次,不需要編程你就可以實(shí)現(xiàn)對(duì)同樣數(shù)據(jù)的不同的視圖表示。