1 引言
XML(Extensible Markup Language)它是由W3C组织于1998年2月
制定的一种通用语言规范,是SGML 的简化子集,专门为 Web 应用程序而设计.XML作为一种可扩展性标记语言,其自描述性使其非常适用于不同应用间的数据交换,而且这种交换是不以预先规定一组数据结构定义为前提.XML最大的优点是它对数据描述和数据传送能力,因此具备很强的开放性.为了使基于XML的业务数据交换成为可能,就必须实现数据库的XML数据存取,并且将XML数据同应用程序集成,进而使之同现有的业务规则相结合.开发基于 XML的动态应用,如动态信息发布、动态数据交换等,前提是必须有支持XML的数据库支持. XML 提供描述不同类型数据的标准格式 -- 例如:约会记录、购买定单、数据库记录、图形、声音等 -- 并且可一致而正确地解码、管理和显示信息. XML一开始就建构在Unicode(统一码)之上,提供了对多语种的支持,具有世界通用性.
2 XML与数据库的结合
XML数据源有多种多样,根据具体的应用,大概可分为下面三种:一种是XML纯文本文档;第二种是关系型数据库;第三种则来源于其他各种应用数据,如邮件、目录清单、商务报告等.其中,第一种来源,即XML纯文本文档是最基本的也是最为简单的,将数据存储于文件中,其最大的优点在于可以直接方便地读取,或者加以样式信息在浏览器中显示,或者通过DOM接口编程同其他应用相连.第二种数据来源是对第一种来源的扩展,目的是便于开发各种动态应用,其优点则在于通过数据库系统对数据进行管理,然后在利用服务器端应用(如ASP、JSP、Servlet)等进行动态存取.这种方式最适合于当前最为流行的基于三层结构的应用开发.第三种数据由于来源广泛,因此需要具体情况具体对待.本文的分析主要针对前两种数据来源进行分析.
对于XML文档,可以通过DOM(Document Object Model)读取XML文档中的节点,是最基本也是最底层的XML存取技术. DOM是W3C的一种技术标准,实际上是提供一组API来存取XML数据. DOM可以通过JavaScript,VBScript等脚本程序来实现,也可通过C++、Java等高级语言来实现.
其次,也可通过DSO(Data Source Object)进行XML的数据绑定可以方便地将XML节点同HTML标记捆绑,从XML文档中读取或写入数据,就象访问Microsoft Access或Microsoft SQL Server一样;而 HTTP+SQL是 Microsoft新近提出的SOAP方案的核心,其基本原理是通过基于HTTP协议的URL方式直接访问SQL SERVER数据库,并返回以XML 或HTML数据格式的文档.
XML数据库又分为两种:一种是以XML原始格式存储的数据库我们称为"native-XML数据库";另一种是以XML格式存入和导出,且它本身又是一个数据库,我们称为"XML-enabled数据库".
2.1 native-XML数据库
对于native-XML数据库的访问,我们可以通过XQL语言来完成. 通过XQL我们可以对一个或多个XML文件进行查询,它返回一个封装在根元素(sql:result)的节点集,这个节点集也是一个XML文件.
2.2 XML-enabled数据库
因为数据是以XML格式存入和导出,且它本身又是一个数据库,这就涉及到异构数据库间的互访问题. XML提供了一种连接关系数据库和面向对象数据库以及其他数据库系统之间的访问技术,也就是说我们可以先对关系数据库和面向对象数据库以及其他数据库系统进行访问,然后生成XML文件,再将文件存入数据库或作其他处理.
3 使用JSP连接数据库并进行查询生成 XML文档
我们有许多方法可做到连接数据库并进行查询,生成 XML文档.以下是通过JSP技术对SQL Server存储的 XML 文档进行查寻并提取这些文档,然后将其传送给用户.(SQL Server数据库本身就支持XML格式.对于不支持 XML 的数据库,您可以将 XML 文档存储为字符大对象(CLOB),并以文本块的方式检索文档.)Java语言应用程序的开发者提供了一个通用的SQL数据库访问和存储结构,即JDBC, 它是一种用于数据库访问的应用程序编程接口(API),开发者可以通过JDBC产品组件之一JDBC-ODBC桥来完成:与数据库建立连接、发送语句、处理结果等工作.在与数据库建立连接之前,必须将桥驱动程序类sun.jdbc.odbc.JdbcOdbcDriver添加到名为 jdbc.drivers的java.lang.System属性中,或用Java类加载器将其显式加载.显式加载代码如下:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
该驱动程序可用于Oracle、Sybase、等数据库.我们可以用一个简单的例子来说明如何在用JDBC接口来实现数据库的连接,执行一个查询(其结果为一组 XML 文档),分析查询结果,并将分析过的数据写入输出流中.以下是与此关系最密切的代码部分:
注意,在安装数据库以后,您需要完成以下三件事情才能使此代码工作:
首先,将 DbOwner、DbUserid 和 DbPasswd 变量改为适合系统的适当值.
// 一定要正确更改这三个字符串,否则servlet 不会工作.
DbUserid = "xxxxxx";
DbPasswd = "xxxxxx";
DbOwner = "xxxxxx";
<%@ page info="package dbxml.sax"%>
<%@ page import="org.xml.sax.*"%>
<%@ page import="org.xml.sax.InputSource"%>
<%@ page info="database handler"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%
try
{
res.setContentType("text/xml");
//加载使用适合您的系统的驱动程序
//下面的代码为加载JDBD-ODBC驱动程序
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (Exception e)
{
System.out.println("Can't get the driver!");
e.printStackTrace();
}
//建立连接
//第二步是用适当的驱动程序连接到DBMS,假定已建立源数据库test,在test中已建立表name
String url="jdbc:odbc:test";
Connection con=DriverManager.getConnection(url, "administrator", "password");
//"administrator","password"是用户名和口令
//然后创建一个JDBC声明
Statement stmt = con.createStatement();
//执行声明,显示结果集。我们从每行取出 XML 文档,
//对其进行分析,然后打印 DOM 树。当没有更多的行时,rs.next() 返回false。
ResultSet rs=stmt.executeQuery(SQL);
while (rs.next())
{
String nextOrder = rs.getString(1).trim();
Document doc = null;
StringReader sr = new StringReader(nextOrder);
InputSource iSrc = new InputSource(sr);
try
{
parser.parse(iSrc);
doc = parser.getDocument();
}
catch (Exception e)
{
System.err.println("Sorry, an error occurred: " + e);
}
if (doc != null)
printDOMTree(doc, out);
}
rs.close();
stmt.close();
con.close();
%>
返回的XML文档可以通过指定的XML模式来定义,三种模式为:RAW、AUTO、EXPLICIT。还可以用SELECT语句中附加 FOR XML来返回XML格式数据作为对XML模式的一种补充,通过在FOR XML中指定DTD或XML schema来达到对返回XML文档的格式化.此外我们利用基于XML的UPDATE语句来更新数据库中的记录,SQL Server支持基于XML的插入、删除、修改等数据库更新操作.
4 XML模式与关系模式的相互转换
为了完成异构数据库间的通讯,必须实现RDMS→XML→RDMS的转换.一个具体的XML模式到关系模式的数据转换需要涉及较为复杂的XML格式分析处理及相应的数据库操作及有效性校验.我们通过对XML的数据模型与关系模型的特征的比较,认为两者转换的实质是(1) 从XML中的数据(存在方式可以是Content、属性值、元素名等)到关系模式中字段的映射;(2) 从XML中数据的相互位置关系到关系模式中元组与元组的关系及元组与字段的关系的映射. XML模式与关系模式的转换的核心与实质就是按XPDL编写的转换规则和转换规则的执行解释方法,下面就依次分别介绍从XML模式到关系模式的转换规则的组成部分和执行方法,以及从关系模式到XML模式的转换规则的组成部分和执行方法.从XML模式到关系模式转换的转换规则脚本:由关系模式的定义和XML模式到关系模式转换规则的定义组成;从关系模式到XML模式转换的转换规则脚本:由关系模式的定义和关系模式到XML模式转换规则的定义组成.
4.1 XML模式到关系模式转换
(1)关系模式定义
下面是一个关系模式定义的例子
…
…
…
一个关系模式的定义分两部分:数据源(Data Source)定义和实体(包括关系实体)的定义。数据源的定义不外乎ODBC/JDBC/BDE 等几种,定义它的目的在于转换程序的跨平台的通用性。实体定义包含两部分:结构定义和约束定义。结构定义类似关系数据库的表定义,包含对每个字段的类型、长度等的定义。约束定义则主要包含对字段的外键和引用的约束定义。
(2)XML模式到关系模式转换规则(X2RConversion)的定义
XML模式到关系模式的转换的目标,是将某一种XML Schema定义好的XML文档中的Content部分、属性值部分转换成关系模式中的某个元组的某个字段的值,而将他们之间的位置关系转换成关系模式中的外键等应用关系。
…
…
…
…
转换的基本算法是遍历等待转换的XML文档的DOM树,对于每个结点而言,从根到该结点的路径作为其转换标识.每一个转换入口是一个转换标识后缀,当某一转换入口转换标识后缀匹配当前结点的转换标识,则启动当前转换入口对应的转换规则.所有的转换入口都定义在Entrance元素内.每一个转换规则都是由一个Record元素开始的,一个Record元素的下层元素表示了其对应的元组的新记录的创建、数据的转换规则及其关联元组的的新记录的创建、数据的转换规则,也就是说Record元素是可嵌套的.
此外,转换还将遵循以下原则:任意两个Record转换实例的转换位置所对应的元素绝不相同,但被Node标定的元素并不受该限制,也就是说在转换算法中只记住每个Record实例的执行位置;而在同层规则执行顺序上,是按Default元素、Node元素、Reference元素、Record元素的次序的,一个次序在后的有效操作是可以覆盖次序在前的有效操作的.
4.2 关系模式到XML模式转换
(1)关系模式到XML模式的转换规则(R2XConversion)的定义
从关系模式到XML模式的转换,实质上是一个将一个预先定义好的视图运行,并将当前视图内容转化成XML格式显示.在具体实现上,我们是将格式和视图定义融合在一起.在关系模式到XML模式的转换中,关系模式定义段中的entity可以对应一个SQL查询语句,也就是使用SQL语句代替原先在id中指明的表名,所有的数据准备基本在关系模式定义段已经完成.下面是一个关系模式到XML模式的转换规则的示例,它的执行是通过深度遍历转换规则,逐个分枝拓展创建,并最终完成整个XML文档DOM树的创建.同样,其中仅支持一条路径扩展出的子树中的相对位置的关联转化,其具体结构与前面类似这里就不赘述.
5 结束语
目前数据库已不再仅仅局限于存储数据,而是向着更深层次、更多样化发展,它已经广泛运用于OLAP、OLTP、数据仓库、数据挖掘、移动计算、嵌入式计算和Web应用等诸多方面.现在,数据库技术也已经深入到各行各业,尤其在媒体、金融、交通、商业等领域得到了广泛应用.本文则着重讲解了对XML数据库的访问技术和异构数据库之间通过转换成XML实现互访.我们有理由相信,XML同数据库的相结合将随着XML技术的发展,会实现更强大的功能.