2014年6月23日 星期一

[SAP][Data Service] 使用 DTD 轉換 XML 資料

XML 檔案可能會有巢狀式的資料,要轉入資料表中,必須扁平化 XML 的元素,才能將非規格化的資料轉入資料表中。對 XML 文件而言,DTD可有可無。

  •  Well-formed XML 文件:
    • 沒有對應的 DTD 或 XML Schema。
    • 只需符合 Well-formed XML 規則。
  • Valid XML 文件:
    • 有對應 DTD 或 XML Schema。
    • 除符合 well-formed XML 規則外,文件內容結構須符合 DTD 或 XML Schema 之規範。
這次使用 DTD 的結構來匯入 XML 文件。新增一個 Project ,並加入一個 Work Flow ,在 Work Flow 下加入 Data Flow。
先匯入 Document Type Definition ( DTD ),在 Object Library 切換至 Formats 頁籤,滑鼠右鍵點擊 DTDs 並點選 New,會出現一個 Import DTD Format 的對話方塊。
輸入 DTD definition name ,瀏覽至 DTD 的 File name ,在 File Type 使用預設的 DTD 選項,選擇 Root element name 有下拉選單中選取。


將剛建立的 DTDs 下的物件拖拉至工作區中,並設定為 Make XML File Source,在 Source 頁籤 XML file 中指定 XML 檔案位置,並勾選 Enable validation 讓 DTD 檢查 XML 的格式是否正確。


由工具列中拖拉一個 Query Transform 物件及在 Datastores 中將資料表拖拉至工作區,並選擇 Make Target,拖拉之間的連結。

打開 Query 的編輯器,將 DTD 結構的元素對應至資料表中,但無法將巢狀的欄位對應至資料表中。將 Schema Out 中將五個欄位剪下至剪貼簿中 ( Cut 剪下而不是使用 Delete 刪除 ),因後續要將這些欄位名稱及資料型態貼回適當的位置中。


從 Schema In 中將 MTRL_MASTER schema 拖拉至 Schema Out 中。



在輸出結構中 ( 右邊視窗 ) ,滑鼠右鍵點選 MTRL_MASTER選取 Make Current ,才能編輯。



選取所有的欄位,從 MTRL_ID 以下刪除,巢狀結構的部分要選取上層節點,也刪除 HAZMAT_IND 這個 Schema,在 TEXT 這個 Schema 下的欄位皆刪除,包含 TEXT_nt_1。若遇到不能編輯時,請先點選所屬的 Schema,按右鍵選擇 Make Current。最後在 MTRL_MASTER 上按右鍵 Paste 剛才剪下的目標資料表的欄位。


重新配對欄位資料


Schema Out 中 SHORT_TEXT 的目標欄位必須對應至 Schema In 位於 TEXT 巢狀節點內的 SHORT_TEXT。為了擷取 Schema Out 的 SHORT_TEXT 欄位名稱及資料型態,先將其剪下至剪貼簿。

將 Schema Out 中,點選 TEXT 按右鍵貼上。



將 Schema In 中的 SHORT_TEXT 對應至 Schema Out 中。


Schema In 中是巢狀的資料,無法轉至非巢狀的資料表中,所以必須在 Schema Out 中,將 TEXT 轉為 Unneset。其圖示會出現一個小箭頭。



Schema Out 中還有兩層,所以 MTRL_MASTER 也要進行 Unnest。



執行 JOB 可以看到成功的訊息!!



在資料庫中也可以看到資料已匯入


DTD 及 XML 檔案如下圖所示




PS.後來實作比較快的做法如下:

將資料來源、Query Transform 及目的資料表物件拉好。



在資料來源的 File Type 使用預設的 DTD 選項,選擇 Root element name 有下拉選單中選取。並指定 XML 檔的位置於 File name 中。( 執行 JOB 時,須將相關檔案置於 Server 中 )


點選 Query Transform 進入編輯。刪除 Schema Out 中所有資料表欄位。



再將 Schema In 中的拖拉 MTRL_MASTER 至 Schema Out 中。


在 Schema Out 中,將目的資料表沒有的欄位刪除,若有無法編輯時,點選右鍵選 Make Current。

修改 Schema Out 中的 Data Type 與資料表的一致。



Schema Out 中,再將 MTRL_MASTER 及 TEXT 節點設為 Unnest 。


執行 JOB 成功後,可點選目標資料表進行檢視




沒有留言: