2010年4月24日 星期六

使用 DB2 pureXML的功能將XML文件Shred到 Relational Tables

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本介紹使用的例子是在這篇 developerworks文章所附的範例。將這個範例解開後,可發現內含下列內容

image

其中,crdb及crtable分別為建立資料庫及 表格的SQL指令。首先需先使用這兩個檔案,建立所需的表格。而mail.xml是要匯入的XML檔案;mails.xsd則為該XML的schema檔案。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在DB2 V9中,可以使用下列兩種方式,將XML文件轉成Relational表格儲存

  1. 使用 Annotated XML decomposition功能
  2. 使用 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的方式

  1. REGISTER    XMLSCHEMA     ADD    'http://yourschemaURI'    FROM      'Schema檔案所在位置'     AS  userSchemaName.SchemaName
  2. 如果要匯入的XML Schema由多個Schema檔案組成,先使用上面的指令匯入主要的Schema後,再使用下列指令,加入其它的Schema檔案 
    ADD    XMLSCHEMA    DOCUMENT      TO     userSchemaName.SchemaName       ADD     ‘http://anotherSchemaURL’   FROM        ‘Schema檔案所在位置’
  3. 使用下列指令,完成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
        }
    }

}

/////////////////////////////////////////////////////////

沒有留言:

張貼留言