1. 概述
1.1 版本
FineDataLink 版本 | 功能變動 |
---|---|
4.0.9 | |
4.2.5.4 | 「XML解析」算子設定項中: 1)去掉「命名空間」設定項,該設定項說明請參見歷史版本文檔 2)上游節點為 API 輸入且資料未展開為二維表時,源欄位預設為 responseBody 3)XML 語句中支援包含一些不合法字元 4)支援自動獲取 XML 檔案的「命名空間前綴」、「命名空間URL」 5)支援解析非末端節點 6)可批量去除「解析後欄位名稱」中的空間前綴 7)解決多層拆塊問題 8)優化新增刪除節點邏輯 |
1.2 應用場景
對於 API、WebService、OData API中回應資料傳回的 XML 格式資料、來自 XML 檔案的資料,使用者想要將其解析為行列格式資料,以供後續加工儲存。
1.3 功能簡介
FineDataLink 支援在「資料轉換」中使用「XML解析」算子將 XML 格式資料解析為行列格式資料,以供後續加工儲存。
1.4 相容說明
4.2.5.4 之前版本,非同一層級下的節點同時被選中解析時,會各自生成解析結果,未解析到的欄位補 NULL,結果做「UNION」。如下圖所示:
情況一:
使用者使用多個 XML 解析分層解析資料,並透過其他算子進行連接,若升級到 4.2.5.4 及之後版本,不會產生相容性問題。
情況二:
使用一個 XML 解析算子解析後,透過不同的篩選把資料分成兩部分,或者使用 SparkSQL 實現其他操作,若升級到 4.2.5.4 及之後版本,會產生相容性問題,需要調整任務。
2. 功能說明
「XML解析」算子配置介面如下圖所示:
2.1 選擇源欄位
1)下拉列表內容為所有前置欄位名。
2)上游節點為 API 輸入且資料未展開為二維表時:
4.2.5.4 之前版本,源欄位預設為 default。
4.2.5.4 及之後版本,源欄位預設為 responseBody。
3)「解析後保留所有上游匯出欄位」按鈕:勾選後,將所有上游匯出欄位與解析產生的新欄位合併匯出。
4)4.2.5.4 及之後版本,XML 語句中包含下面所示字元能正常解析不報錯;
2.2.1 4.2.5.4 之前版本
詳情請參見:歷史版本
2.2.2 4.2.5.4 及之後版本
前提條件 | 說明 |
---|---|
選擇源欄位後&&XML 檔案格式正確&&XML 檔案中有命名空間 | 自動獲取 XML 檔案的「命名空間前綴」、「命名空間URL」 |
選擇源欄位後&&XML 檔案格式正確&&XML 檔案中無命名空間 | 提示沒有命名空間 |
「命名空間前綴」、「命名空間URL」說明如下表所示:
欄位名 | 說明 |
---|---|
命名空間前綴 | 1)支援修改、重新獲取(4.2.5.4 及之後版本支援;點選後,先清空已有內容,再重新獲取)、新增和刪除操作;修改時,需注意:命名空間前綴將影響相關XML節點的XPath路徑,請謹慎修改 2)若獲取到的命名空間無前綴,則給預設值default、default1、default2......進行命名 3)不允許重名,不能為空 |
命名空間URL | 1)支援修改、重新獲取(4.2.5.4 及之後版本支援;點選後,先清空已有內容,再重新獲取)、新增和刪除操作 2)允許重複 |
2.3 解析 XML 資料
2.3.1 選擇 XML 節點
點選「選擇XML節點」按鈕後,彈出XML節點選擇框。
陣列節點說明:同一層級的多個標籤,因同名而被聚合成一個節點,解析後會有多行資料。
包含陣列的XML範例資料:
4.2.5.4 之前版本:
只能選擇末端節點,非末端節點不能選中。詳細說明請參見:歷史版本
4.2.5.4 及之後版本:
場景 | 說明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
選擇節點 | 1)支援選擇非末端節點和末端節點(末端節點定義:沒有子節點;下圖黃色欄位為末端節點,剩下的欄位為非末端節點) 2)選中非末端節點後,對應欄位以字串形式取節點內部 XML 範例:選 xml 節點時選擇 friendlist 生成的 XPath 需要是紅框部分的路徑,欄位對應值為紅框部分的字串形式 3)支援同時選中:
不支援同時選中: 已選某陣列節點或其子節點,則不能選擇其他陣列或其他子節點 | ||||||||||||
選擇的不是同一層的 XML 節點時 | 資料預覽和實際運作時,對資料進行拼行處理
| ||||||||||||
「解析後欄位名稱」已存在,再次點選「選擇XML節點」按鈕時 | 新選擇的節點按彈窗中的順序在原本已有欄位的下方新增,如果彈窗中取消選擇了已有節點,從原本已有節點中刪除 |
2.3.2 匯出欄位
列表項允許新增,允許刪除。
經過 XML 解析產生的欄位類型統一為字串(從上游帶來的欄位類型不變)。
欄位名 | 說明 |
---|---|
解析後欄位名稱 | 可編輯;配置解析後的欄位名稱 注1:欄位名稱不允許重名 注2:不允許引用參數 |
XPath 路徑 | 可編輯;展示&配置解析後欄位的 XPath 路徑運算式 不允許引用參數 允許手寫 XPath 路徑 |
手寫 XPath 支援的類型:「選取節點」類和「謂語」類
例如 XML 文檔如下:
選取節點
XPath 使用路徑運算式在 XML 文檔中選取節點。節點是透過沿着路徑或者 step 來選取的。
在下面的表格中,我們已列出了一些路徑運算式以及運算式的結果:
路徑運算式 | 結果 |
---|---|
bookstore | 選取 bookstore 元素的所有子節點。 |
/bookstore | 選取根元素 bookstore。 注:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑。 |
bookstore/book | 選取屬於 bookstore 的子元素的所有 book 元素。 |
//book | 選取所有 book 子元素,而不管它們在文檔中的位置。 |
bookstore//book | 選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麼位置。 |
//@lang | 選取名為 lang 的所有屬性。 |
謂語
謂語用來尋找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括號中。
在下面的表格中,我們列出了帶有謂語的一些路徑運算式,以及運算式的結果:
路徑運算式 | 結果 |
---|---|
/bookstore/book[1] | 選取屬於 bookstore 子元素的第一個 book 元素 |
/bookstore/book[last()] | 選取屬於 bookstore 子元素的最後一個 book 元素 |
/bookstore/book[last()-1] | 選取屬於 bookstore 子元素的倒數第二個 book 元素 |
/bookstore/book[position()<3] | 選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素 |
//title[@lang='eng'] | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性 |
/bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00 |
3. 特殊場景處理策略
場景 | 處理策略 |
---|---|
源XML資料存在多個根元素,舉例: | 點選「選擇XML節點」時報錯:XML資料根節點缺失 自行寫XPath,預覽及運作時報錯:XML資料根節點缺失 |
配置的XPath不正確 | 解析出的欄位內容為空 |
配置的XPath非法 或者 命名空間前綴中填寫了非英文字母的字元 | 丟擲解析異常 |
命名空間前綴重複 | 命名空間前綴不可重複 此例中,將兩個 s 中的一個重新命名為其他名稱,並正常填寫對應 URI ,透過樹選的形式可正常解析 如果是手填路徑,需要按照重新命名後的命名空間前綴書寫路徑 |
源XML資料不完整,舉例: | 點選選擇XML節點時報錯:XML資料格式不完整 自行寫XPath,預覽及運作時報錯:XML資料格式不完整 |
4. 範例
「XML解析」算子使用範例請參見:XML解析範例