kettle從入門到精通 第八十四課 ETL之kettle kettle中Get data from XML使用實戰教程

慕容尘轩發表於2024-08-05

場景:解析xml檔案或者內容解析出其中某些欄位。

本來想著這個步驟使用起來比較簡單,就沒有梳理成文,結果群裡的小夥伴為了使用這個步驟折騰了一下午。故有了此文。

在開始學習之前我們一起來學習下xml名稱空間的相關知識,為下文展開做基礎鋪墊。

1、xml名稱空間

XML 的名稱空間(namespace)是為了解決在 XML 文件中使用相同元素或屬性名稱時可能出現的衝突問題。它提供了一種機制來區分和唯一標識不同來源的元素和屬性,從而避免命名衝突。
文件1(未使用名稱空間)
<book>
    <title>Introduction to XML</title>
    <value>123</value>
</book>

文件2(未使用名稱空間)

<product>
    <name>XML Book</name>
    <value>$50</value>
</product>

在文件1和文件2中,<value> 元素在兩個文件中都有定義,但它們的含義是不同的。在沒有名稱空間的情況下,如果你嘗試將這兩個文件合併,或者在處理它們時可能會遇到衝突,因為 <value> 元素的上下文不明確。

文件1(使用名稱空間)

<book xmlns:bk="http://www.example.com/book">
    <bk:title>Introduction to XML</bk:title>
    <bk:value>123</bk:value>
</book>

文件2(使用名稱空間)

<product xmlns:pr="http://www.example.com/product">
    <pr:name>XML Book</pr:name>
    <pr:value>$50</pr:value>
</product>

在這些文件中,bk:valuepr:value 具有不同的名稱空間,因此它們是完全不同的元素,即使它們的本地名稱相同。這樣就避免了名稱衝突,並且每個元素的含義都被明確標識。

2、瞭解了xml名稱空間的作用,我們言歸正傳,繼續學習如何使用Get data from XML步驟。xml檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header/>
<soapenv:Body>
<ns:loginResponse xmlns:ns="http://webservice.zhending.com">
<ns:return>{"result":"success","data":{"inputOrganCode":"aaa","inputOrganName":"bbbb","userIdcard":"cccc","userName":"ddd","token":"eeee"},"message":"操作成功"}</ns:return>
</ns:loginResponse>
</soapenv:Body>
</soapenv:Envelope>

3、拖動步驟【Get data from XML】、【寫日誌】兩個步驟到畫布中並連線,如下圖所示:

4、按照下圖所示,點選按鈕【瀏覽】選中檔案demo.xml,然後點選按鈕【增加】

5、點選最下面的按鈕【預覽】,彈出提示要設定開始迴圈的xmlpath。

6、切換到內容tab,點選按鈕【獲取XML文件的所有路徑】,彈窗會列出xml檔案中的所有path,我們根據自己的要求選擇一個path,這裡我們選擇第一個根path。

7、設定迴圈讀取路徑,切換到欄位tab我們繼續設定要提取的欄位。這裡直接點選按鈕【獲取欄位】即可自動填充xml檔案中的欄位,可以根據填充的內容以及自己的實際應用場景進行微調。

8、儲存&執行,執行報錯,如下圖所示:

錯誤資訊:

Exception occurred evaluting XPath: soapenv:Body/ns:loginResponse/ns:return. Exception: XPath expression uses unbound namespace prefix ns。

錯誤資訊翻譯:

異常發生在評估 XPath 時:soapenv:Body/ns:loginResponse/ns:return。異常:XPath 表示式使用了未繫結的名稱空間字首 ns。

9、kettle如果連名稱空間都處理不了那就太弱了,繼續尋找配置引數。切換到內容tab,將考慮名稱空間勾選。儲存&執行,轉換正常執行。如下圖所示:

注意:若xml檔案內容或者xml文字沒有使用名稱空間的話就不用勾選此引數。

10、上面的例子只是解決了從xml檔案中讀取,稍加改造支援從前置步驟讀取xml文字內容。本次示例透過步驟【生成記錄】生成xmlCont欄位,當然也可以來源於http/https結果欄位等,如下圖所示:

11、根據下圖所示,勾選引數XML源定義在一個欄位裡和選擇XML源欄位名,其他保持不變。儲存&執行,轉換可以正確執行。

12、這裡如果是xml文字,依然可以使用步驟自動生成xmlpath,切換到欄位tab,點選按鈕獲取欄位,將xml文字貼上到文字框&然後點選確定即可自動填充xmlpath。如下圖所示:

相關文章