+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本介紹使用的例子是在這篇 developerworks文章所附的範例。將這個範例解開後,可發現內含下列內容
其中,crdb及crtable分別為建立資料庫及 表格的SQL指令。首先需先使用這兩個檔案,建立所需的表格。而mail.xml是要匯入的XML檔案;mails.xsd則為該XML的schema檔案。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在DB2 V9中,可以使用下列兩種方式,將XML文件轉成Relational表格儲存
- 使用 Annotated XML decomposition功能
- 使用 XMLTABLE functional call
其中,第一種方式需要將Annotated 過的 XML Schema註冊到 DB2的 XML Schema Repository(XSR)。Data Studio這個免費的程式可以協助在XML schema中進行annotation。Annotate 完成之後,再將其註冊到XSR中。註冊的方式有很多種,可以使用DB2 Command Line、呼叫DB2 提供的 Stored Procedure,或是直接用Java程式,透過DB2提供的JDBC Driver進行。這裡先介紹使用Command Line的方式
- REGISTER XMLSCHEMA ADD 'http://yourschemaURI' FROM 'Schema檔案所在位置' AS userSchemaName.SchemaName
- 如果要匯入的XML Schema由多個Schema檔案組成,先使用上面的指令匯入主要的Schema後,再使用下列指令,加入其它的Schema檔案
ADD XMLSCHEMA DOCUMENT TO userSchemaName.SchemaName ADD ‘http://anotherSchemaURL’ FROM ‘Schema檔案所在位置’ - 使用下列指令,完成Schema的註冊
COMPLETE XMLSCHEMA userSchemaName.SchemaName
上面所述的 userSchemaName.SchemaName中, userSchemaName指的是 DB2的 Schema命名空間名稱;而SchemaName則是指匯入的Schema的XML Schema命名空間。
註冊完成後,還需啟用所匯入的Schema的 XML Decomposition功能。指令如下:
ALTER XSROBJECT xsrObjectName ENABLE DECOMPOSITION
最後,透過下列程式,可以將一個XML文件內容,轉成Relational Table。
///////////////////////////////////////////////////////////////////////////////
import java.sql.*;
import java.io.*;
public class AnnotatedXMLDecomposition {
/**這個程式用來測試使用DB2提供的Annotated XML Decomposition方法,來將XML的資料 parse到Relational Table中
* 使用這個方法來shred XML的前提是,DB2的 XSR(XML Schema Repository)必需先註冊要 Shred文件的 XML Schema。
* 註冊XML Schema的方法有很多,最簡單的方法是在DB2 Command Line中,執行下列指令
* REGISTER XMLSCHEMA ADD 'http://yourschemaURI'
* FROM 'SchemaFileLocation' AS userSchemaName.SchemaName
*
* 其中,userSchemaName指的是 DB2的 current Schema name
*
*/
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "jdbc:db2:MAILDCMP";
try {
Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection con = DriverManager.getConnection(url);//取得Connection
String sql = "{CALL xdbDecompXML(?,?,?,?,?,NULL,NULL,NULL)}";
CallableStatement cstmt = con.prepareCall(sql);
String filename = "E:/DB2_pureXML_Study/mail/mail/mail.xml";
File currFile = new File(filename);
long length = currFile.length();
//設定DB2 current Schema名稱
cstmt.setString(1, "BIOFLASH");
//設定 XML Schema名稱
cstmt.setString(2, "MAILSCHEMA");
//讀入XML文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(currFile));
cstmt.setBinaryStream(3,bis, (int) length);
//XML 文件 ID
cstmt.setString(4, "TEST001");
//設定要不要進行XML的 Schema validation
int validate = 1;
cstmt.setInt(5, validate);
//其它的參數先放為NULL
cstmt.execute();
con.commit();
cstmt.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (SQLException e){
e.printStackTrace();
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
}
}}
/////////////////////////////////////////////////////////
沒有留言:
張貼留言