2017-02-01 63 views
0

我有一個要求,即必須將傳入的XML碎化並加載到數據庫中。 所有元素都有它們各自的表格。 傳入XML看起來是這樣的:如何遍歷XML中的元素以碎化並加載到數據庫

<root> 
    <creditreport> 
    <data1> 
     <A>val1</A> 
     <B>val2</B> 
    </data1> 
    <data2> 
     <C>val3</C> 
     <D>val4</D> 
    </data2> 
    <data3> 
    <E>val5</E> 
    <F>val6</F> 
    </data3> 
    <data3> 
    <G>val7</G> 
    <H>val8</H> 
    </data3> 
    </creditreport> 
</root> 

現在在水壺我設計一個通用的框架,獲取XML切絲入數據庫。 我正在使用「獲取XML數據」組件來讀取XML。 我已經定義了「循環Xpath的」作爲根/ creditreport然後我已閱讀領域的一個接一個的東西如:

name xpath Element ResultType 
A  data1 Node  Valueof 
B  data1 Node  Valueof 
..... 
..... 
..... 
E  data3 Node  Valueof 
..... 
..... 
G  data3 Node  Valueof 

但問題是,它切碎只有第一行和缺少第二個。我可以理解XPATH循環只有到的原因。 如果我將'xpath loop'定義爲'root/creditreport/data3',那麼元素'data3'的問題會得到解決,但也有其他元素可以重複,然後我會再次站在我的問題的起點。

任何建議!

+0

你的意思是第二個「creditreport」記錄不處理或數據X元素的第二行? – Cyrus

+0

@Cyrus第二行數據DataX元素 –

回答

2

如果兩家母公司(數據X)和子節點(A,B,C,等等)是非常獨特/順序也可以使一個非常通用的設置:

使用/root/creditreport/*/*作爲XPath的循環路徑

設置字段這樣手動:

Field definitions in Get Data from XML

這應該讓你像這樣的輸出:

Output sample

從這裏您可以非規範化或以其他方式處理您的數據。請注意,我已經爲父級別的節點添加了序列號,因此您可以區分第一個Data3和第二個Data3等。

如果另一方面您的dataX節點都具有相同的子節點(A ,BA,B而不是A,BC,D等),則可以使用/root/creditreport/*作爲xpath循環路徑,並跳過父節點字段,正常配置值節點A和B.

這裏是定義和輸出。所有字段都是相對於當前節點(。)定義的。

enter image description here

enter image description here

+0

哇!正是我想要的。你搖滾! –

+0

@賽勒斯 - 只有一個小問題。當我選擇解決方案中給出的第二個選項時,即設置/ root/creditreport/*並正常配置節點時,幾行空白行也會與必需的行分開。任何想法!! –

+0

例如,我在上面提到我的問題,如果有兩個條目以及,那麼輸出爲和兩個空行所需的兩行。同樣也是。 –