場景:解析xml檔案或者內容解析出其中某些欄位。
本來想著這個步驟使用起來比較簡單,就沒有梳理成文,結果群裡的小夥伴為了使用這個步驟折騰了一下午。故有了此文。
在開始學習之前我們一起來學習下xml名稱空間的相關知識,為下文展開做基礎鋪墊。
1、xml名稱空間
<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:value
和 pr:value
具有不同的名稱空間,因此它們是完全不同的元素,即使它們的本地名稱相同。這樣就避免了名稱衝突,並且每個元素的含義都被明確標識。
<?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。如下圖所示: