XML解析算子

  • 文档创建者:Roxy
  • 历史版本:24
  • 最近更新:Nikozhan 于 2025-04-27
  • 1. 概述

    1.1 版本

    FineDataLink 版本功能變動
    4.0.9


    新增「XML解析」算子,可以將輸入 XML 資料解析為行列形式的資料


    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 語句中包含下面所示字元能正常解析不報錯;

    \u0000-\u0008: ASCII 碼 0-8,包括:NUL(空字元)、SOH(標題開始)、STX(正文開始)、ETX(正文結束)、EOT(傳輸結束)、ENQ(請求)、ACK(確認)、BEL(響鈴)、BS(倒退)
    \u000B: ASCII碼11,即 VT(垂直列表符)
    \u000C: ASCII碼12,即 FF(換頁符)
    \u000E-\u001F: ASCII碼 14-31

    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)支援選擇非末端節點和末端節點(末端節點定義:沒有子節點;下圖黃色欄位為末端節點,剩下的欄位為非末端節點

    1745473846893780.png

    2)選中非末端節點後,對應欄位以字串形式取節點內部 XML

    範例:選 xml 節點時選擇 friendlist 生成的 XPath 需要是紅框部分的路徑,欄位對應值為紅框部分的字串形式

    1745475166479259.png

    3)支援同時選中:

    • 有從屬關係的節點:例如下圖中的 friendlist 和 name

    • 同一陣列下的同層級節點:例如下圖中的 name、city、ge

    不支援同時選中:

    已選某陣列節點或其子節點,則不能選擇其他陣列或其他子節點

    選擇的不是同一層的 XML 節點時

    資料預覽和實際運作時,對資料進行拼行處

    場景
    範例效果
    匯出欄位中的多個節點,均為同級同父節點時31.png32.png
    匯出欄位中的多個節點,為同一個父節點下的子節點以及父節點的屬性33.png

    父節點的屬性視作為該父節點的一個子節點,和其他子節點同級處

    34.png

    對於匯出欄位中的多個節點,包含不同級節點時31.png

    進行拼行處理,如果有1對n的資料,按照n的部分擴展行;如果有1:N1:N2的資料,按N2的部分擴展N1再擴展1

    36.png

    注1:如果把bstfri中的name和city選中直接在上面加兩列,這兩列的三行每行都是judy sh

    注2:如果解析的XPath路徑中有非末端節點(比方說bstfri節點),擴展成三行,每行值相同,對應欄位以字串形式取節點內部XML(包含當前節點本身,否則XML格式可能不合法)

    注3:父節點的屬性節點在該種情形下同樣視作父節點的子節點,然後根據子節點邏輯進行處理


    「解析後欄位名稱」已存在,再次點選「選擇XML節點」按鈕時
    新選擇的節點按彈窗中的順序在原本已有欄位的下方新增,如果彈窗中取消選擇了已有節點,從原本已有節點中刪除

    2.3.2 匯出欄位

    列表項允許新增,允許刪除。

    經過 XML 解析產生的欄位類型統一為字串(從上游帶來的欄位類型不變)。

    欄位名
    說明
    解析後欄位名稱可編輯;配置解析後的欄位名稱

    注1:欄位名稱不允許重名

    注2:不允許引用參數

    XPath 路徑可編輯;展示&配置解析後欄位的 XPath 路徑運算式

    不允許引用參數

    允許手寫 XPath 路徑

    手寫 XPath 支援的類型:「選取節點」類和「謂語」類

    例如 XML 文檔如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <bookstore>

    <book>
      
    <title lang="eng">Harry Potter</title>
      
    <price>29.99</price>
    </book>

    <book>
      
    <title lang="eng">Learning XML</title>
      
    <price>39.95</price>
    </book>

    </bookstore>

    選取節點

    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資料存在多個根元素,舉例:

    1685427389170899.png

    點選「選擇XML節點」時報錯:XML資料根節點缺失

    自行寫XPath,預覽及運作時報錯:XML資料根節點缺失

    配置的XPath不正確解析出的欄位內容為空

    配置的XPath非法

    或者

    命名空間前綴中填寫了非英文字母的字元

    丟擲解析異常

    命名空間前綴重複

    9.png

    命名空間前綴不可重複

    此例中,將兩個 s 中的一個重新命名為其他名稱,並正常填寫對應 URI ,透過樹選的形式可正常解析

    如果是手填路徑,需要按照重新命名後的命名空間前綴書寫路徑

    源XML資料不完整,舉例:

    1685427733248711.png

    點選選擇XML節點時報錯:XML資料格式不完整

    自行寫XPath,預覽及運作時報錯:XML資料格式不完整

    4. 範例

    「XML解析」算子使用範例請參見:XML解析範例


    附件列表


    主题: 資料開發-定時任務
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!