適用於:Azure Logic Apps (使用量 + 標準)
對於企業對企業(B2B)整合工作流程,通常需要先將資料從 XML 格式轉換到 flat file 格式,才能與交易夥伴交換這些資料。
本指南說明如何利用 Flat File 內建的連接器動作來編碼或解碼 XML,並從範例資料產生相容於 BizTalk 的平面檔案結構。
連接器技術參考
平面檔案連接器包含以下編碼、解碼及結構產生動作:
| Action | 使用量 | 標準 |
|---|---|---|
| 平面檔案編碼 | 是的 | 是的 |
| 平面檔案解碼 | 是的 | 是的 |
| 平面檔案結構產生 | No | 是的 |
| 邏輯應用程式 | 環境 |
|---|---|
| 使用量 | 多租用戶 Azure Logic Apps |
| 標準 | 單一租用戶 Azure Logic Apps、App Service 環境 v3(僅限 Windows 方案)和混合式部署 |
欲了解更多資訊,請參閱 整合帳號內建連接器。
先決條件
Azure 帳戶和訂用帳戶。 申請一個免費的 Azure 帳號。
您希望使用一般檔案操作的邏輯應用程式資源與工作流程。
平面檔案 操作不包含任何觸發條件。 你的工作流程可以從任何觸發器開始,或使用任何動作來取得原始 XML。
本文範例使用名為「當 HTTP 請求被接收時」的請求觸發器。
如需詳細資訊,請參閱:
一個 整合帳戶資源,用於定義和儲存企業整合及 B2B 工作流程所需的構件。
您的企業整合帳戶和邏輯應用程式資源必須存在於相同的 Azure 訂用帳戶和 Azure 區域中。
在開始使用一般檔案操作前,您必須將使用量邏輯應用程式或標準邏輯應用程式連結至整合帳戶,以便使用交易夥伴與合約等成品。 你可以將整合帳號連結到多個消費型或標準邏輯應用程式資源,以共享相同的產物。
小提示
如果你不是在標準工作流程中處理 B2B 產物,例如交易夥伴和協議,可能不需要整合帳號。 相反地,你可以直接將結構上傳到你的標準邏輯應用程式資源。 不管怎樣,您都可以在同一個邏輯應用程式資源中,對所有子工作流程使用相同的結構描述。 要在多個 Logic App 資源中使用相同的架構,你必須使用並連結一個整合帳號。
一個平面檔案結構,規定如何編碼或解碼 XML 內容。
在標準工作流程中,一般檔案操作可讓您從已連結的整合帳戶或之前上傳至邏輯應用程式的結構描述中選擇,但不能同時選擇兩者。
欲了解更多資訊,請參閱 「為整合帳號新增結構」。
安裝或使用可傳送 HTTP 要求以測試解決方案的工具,例如:
- Visual Studio Code 搭配 Visual Studio Marketplace 的擴充功能
- PowerShell Invoke-RestMethod
- Microsoft Edge - Network Console 工具
- 布魯諾
- curl
注意
針對您有敏感數據的案例,例如認證、秘密、存取令牌、API 密鑰和其他類似資訊,請務必使用一個工具,以必要的安全性功能保護您的數據。 此工具應該離線或本機運作,且不需要登入線上帳戶或將數據同步處理至雲端。 當您使用具有這些特性的工具時,可以降低公開敏感數據給公眾的風險。
限制
要解碼的 XML 內容必須以 UTF-8 格式編碼。
在您的一般檔案結構描述中,請確保所包含的 XML 群組沒有將
max count屬性設為大於 1的值。 避免在另一個max count屬性大於 1 的 XML 群組內巢狀包含max count屬性值大於 1 的 XML 群組。當 Azure Logic Apps 解析扁平檔案結構,且結構允許選擇下一個片段時,Azure Logic Apps 會產生該片段的 符號 與 預測 。 如果結構允許的構造太多,例如超過100,000個,模式擴展會變得非常龐大,這會消耗過多資源和時間。
上傳結構描述
建立架構後,根據你的工作流程上傳架構:
新增一般檔案編碼操作
在 Azure 入口網站中,開啟您的邏輯應用程式資源。
在設計工具中,開啟您的工作流程。
如果工作流程沒有觸發程序或其他必要操作,請先新增這些操作。
此範例使用「請求」觸發程式,名為「收到 HTTP 要求時」。 要新增觸發器,請參見 「新增觸發器以開始你的工作流程」。
在設計器中,依照 以下一般步驟 加入名為 Flat File Encoding 的內建動作。
動作資訊窗格開啟時,會顯示 參數 標籤。
在動作的 Content 參數中,提供要編碼的 XML 內容,該內容可由觸發器輸出或先前動作輸出,步驟如下:
在 內容 框中選擇,然後選擇閃電圖示以開啟動態內容清單。
從動態內容列表中,選擇要編碼的 XML 內容。
以下範例顯示已開啟的動態內容清單、 當 HTTP 請求被接收時 的輸出,以及觸發器輸出所選的 Body 內容。
附註
如果主體未出現在動態內容清單中,請在收到 HTTP 請求時區段標籤旁選取查看更多。 您也可以直接在內容方塊中輸入要編碼的內容。
從結構描述名稱清單中,選取您的結構描述。
附註
若結構清單為空,原因可能如下:
- 此 Logic 應用程式的資源並沒有連結到整合帳戶。
- 連結的整合帳號沒有任何結構檔案。
- Logic 應用程式資源中沒有任何結構檔案。 這個理由只適用於標準邏輯應用程式。
若要在動作中新增其他可選參數,請從 進階參數 列表中選擇這些參數。
參數 值 說明 空節點生成模式 ForcedDisabled 或 HonorSchemaNodeProperty 或 ForcedEnabled 用於一般檔案編碼時空節點生成的模式。
對於 BizTalk,一般檔案結構描述有控制空節點生成的屬性。 您可以依據一般檔案結構描述的空節點生成屬性行為進行操作。 或者,你也可以用這個設定讓 Azure Logic Apps 產生或省略空節點。 更多資訊請參閱空元素標籤。XML 正規化 是或否 此設定用於啟用或停用一般檔案編碼中的 XML 正規化。 更多資訊請參閱 XmlTextReader.Normalization。 儲存您的工作流程。 在設計工具的工具列上,選取 [儲存]。
加入平面檔案解碼動作
在 Azure 入口網站中,開啟您的邏輯應用程式資源。
在設計工具中,開啟您的工作流程。
如果工作流程沒有觸發程序或其他必要操作,請先新增這些操作。
此範例使用「請求」觸發程式,名為「收到 HTTP 要求時」。 要新增觸發器,請參見 「新增觸發器以開始你的工作流程」。
在設計器中,依照 以下一般步驟 加入名為 平面檔案解碼的內建動作。
在動作的 Content 參數中,提供要解碼的 XML 內容,無論是來自觸發器的輸出或先前動作的輸出,依照以下步驟:
在 內容 框中選擇,然後選擇閃電圖示以開啟動態內容清單。
從動態內容列表中選擇要解碼的 XML 內容。
以下範例顯示已開啟的動態內容清單、 當 HTTP 請求被接收時 的輸出,以及觸發器輸出所選的 Body 內容。
附註
如果主體未出現在動態內容清單中,請在收到 HTTP 請求時區段標籤旁選取查看更多。 您也可以將要解碼的內容直接輸入在 [內容] 方塊中。
從結構描述名稱清單中,選取您的結構描述。
附註
若結構清單為空,原因可能如下:
- 此 Logic 應用程式的資源並沒有連結到整合帳戶。
- 連結的整合帳號沒有任何結構檔案。
- Logic 應用程式資源中沒有任何結構檔案。 這個理由只適用於標準邏輯應用程式。
儲存您的工作流程。 在設計工具的工具列上,選取 [儲存]。
您已完成一般檔案解碼操作的設定。 在實際應用程式中,您可能希望將解碼後的資料儲存在企業應用程式 (LOB),例如 Salesforce。 或者,您可以將解碼後的資料傳送給交易夥伴。 要將解碼操作的輸出傳送到 Salesforce 或交易夥伴,請使用 Azure Logic Apps 中的其他連接器。
新增一個平面檔案結構產生動作
平面 檔案結構產生 動作會在執行時從你提供的範例平面檔案內容中產生 XSD 平面檔案架構。 產生的結構與 BizTalk 平面檔案註解相容,例如 b:schemaInfo、 b:recordInfo、 b:fieldInfo和 。
在 Azure 入口網站中,開啟您的邏輯應用程式資源。
在設計工具中,開啟您的工作流程。
如果工作流程沒有觸發程序或其他必要操作,請先新增這些操作。
此範例使用「請求」觸發程式,名為「收到 HTTP 要求時」。 要新增觸發器,請參見 「新增觸發器以開始你的工作流程」。
在設計器中,依照 以下一般步驟 加入名為 Flat File Schema Generation 的內建動作。
在動作的 Content 參數中,提供平面檔案的範例內容。
你可以使用來自觸發程序輸出或先前動作的內容:
在 內容 框中選擇,然後點選閃電圖示以開啟動態內容清單。
從動態內容清單中,選擇範例平面檔案內容。
將 記錄結構 參數設為 分界 或 位置式。
設計者會使用動態參數(
getFlatFileSchemaGenerationParameters)來顯示根據所選recordStructure值的正確參數集。以下範例展示了 分隔 記錄結構的配置參數:
以下範例展示了 位置 記錄結構的配置參數:
對於你選擇的紀錄結構,設定必要的和可選參數。
常見參數(分界與位置)
參數 類型 Required 說明 contentAny 是的 平面檔案範例資料內容(字串或二進位)。 recordStructureString 是的 Delimited或Positional。hasHeader布林值 是的 若 true,則將第一筆記錄行視為標頭,並使用這些值作為產生的欄位名稱。recordDelimiterString No 記錄 (行) 分隔符號。 解析法直接使用這個值(沒有十六進位解碼)。 使用實際字元,例如 \r\n或\n。 若要使用預設的線分割,請省略此值。 產生的 XSD 可在結構註解中輸出十六進位值(0x0D0A)。recordDelimiterOrderString No 分隔符的擺放: Infix(預設)、Prefix、或Postfix。rootElementNameString No XSD 的根元素名稱。 預設值: Root。targetNamespaceString No 結構的目標命名空間。 預設: http://schemas.microsoft.com/FlatFile/{RootElementName}recordNameString No 重複的子系記錄元素名稱。 預設: {RootElementName}_Record限定特定參數
參數 類型 Required 說明 fieldDelimiterString 是的 欄位分隔字元,例如逗號、分號、Tab 字元;請提供實際字元,例如 ,、;或\t。 解析法使用字串比較(不含十六進位解碼)。fieldDelimiterOrderString 是的 分隔符的擺放: Infix(預設)、Prefix、或Postfix。escapeCharacterString No 用於欄位值中內嵌分隔符號的逸出字元。 提供實際字元,例如 \或"。 解析使用字面匹配(不含十六進位解碼)。位置特定參數
參數 類型 Required 說明 countPositionsByByte布林值 是的 以位元組( true)或字元false()來衡量欄位長度。 與多位元組編碼相關。fieldPositions陣列 是的 欄位位置物件的陣列,每個物件都包含 length和justification。fieldPositions[].lengthInteger 是的 場地寬度固定。 fieldPositions[].justificationString 是的 控制填補對齊。 手動輸入數值 Left或Right(大小寫不區分)。
注意:目前的設計器並未提供清單讓你選擇值。在執行工作流程前,請先檢視分隔符和逃逸字元的行為:
記錄分隔符行為
層面 行為 解析(分割行) options.RecordDelimiter(原始使用者值)直接傳遞給String.Split()。 沒有六角解碼。XSD 輸出 GetRecordDelimiterForSchema()轉換如下:
- 如果以0x前置詞開頭,則直接傳遞。
- 若為空,則預設為0x0D0A。
- 否則,將字面字元轉換為十六進位位元組。六進位輸入 不需要剖析。 如果您提供了 0x0D0A,剖析會嘗試依據常值文字0x0D0A進行分割。需提供的內容 使用常值字元: \r\n、\n,或完全省略;若省略,則預設會在\r\n/\n/\r上分割。場分隔符行為
層面 行為 剖析 (分割欄位) options.FieldDelimiter直接傳遞給SplitDelimitedRecord(),作為常值字串比較。 不進行十六進位解碼。XSD 輸出 若值以 0x開頭,則發出child_delimiter_type="hex";否則,發出"char"。六進位輸入 不進行解析。 0x09匹配的是字面文字0x09,不是 Tab。需提供的內容 使用實際字元: ,、;、\t|等等。逃脫角色行為
層面 行為 剖析 (逸出) options.EscapeCharacter會以字面值進行比較。 相符時,下一個字元會依現狀取用。 沒有六角解碼。XSD 輸出 若值以 0x開頭,則輸出escape_char_type="hex";否則,輸出"char"。六進位輸入 不進行解析。 相同的字面比對行為。 需提供的內容 例如,使用實際字元, \或"。儲存您的工作流程。 在設計工具的工具列上,選取 [儲存]。
若要使用產生的結構輸出進行解碼或編碼操作,請手動將此輸出儲存為
.xsd檔案。將
.xsd檔案上傳到您的整合帳戶。 或者,對於標準工作流程,將檔案上傳到 Logic App 資源 的 Artifacts 資料夾。 你也可以用 REST API 上傳結構產物。產生的結構以字串形式回傳於動作輸出主體中:
@body('Flat_File_Schema_Generation')可選擇性地使用以下定義範例:
分界範例
{ "Flat_File_Schema_Generation": { "type": "FlatFileSchemaGeneration", "runAfter": {}, "inputs": { "content": "@triggerBody()", "recordStructure": "Delimited", "fieldDelimiter": ";", "fieldDelimiterOrder": "Infix", "recordDelimiter": "\\r\\n", "hasHeader": true, "rootElementName": "MerchantOrders", "targetNamespace": "http://schemas.contoso.com/FlatFile/MerchantOrders", "recordName": "MerchantOrder", "escapeCharacter": "\\" } } }位置示例
{ "Flat_File_Schema_Generation": { "type": "FlatFileSchemaGeneration", "runAfter": {}, "inputs": { "content": "@triggerBody()", "recordStructure": "Positional", "fieldPositions": [ { "length": 6, "justification": "Left" }, { "length": 5, "justification": "Left" }, { "length": 3, "justification": "Left" } ], "countPositionsByByte": false, "hasHeader": false, "rootElementName": "Ledger", "targetNamespace": "http://schemas.contoso.com/FlatFile/Ledger" } } }將產生的結構傳遞給下一個動作:
{ "Next_Action": { "inputs": { "schema": "@body('Flat_File_Schema_Generation')" }, "runAfter": { "Flat_File_Schema_Generation": [ "Succeeded" ] } } }檢視輸出、推理規則及已知問題:
輸出:
財產 類型 說明 bodyString 以 XML 字串產生與 BizTalk 相容的 XSD 架構。 高層級產生的 XSD 內容:
-
b:schemaInfo註釋,包含standard="Flat File"、root_reference和codepage="65001"(UTF-8) -
b:recordInfo每筆記錄的註解包含structure、child_delimiter、child_delimiter_type、child_order,以及選用的escape_char和escape_char_type -
b:fieldInfo每個欄位的註釋,包含justification;而對於位置式結構描述,則包含pos_offset和pos_length - 從樣本資料推論資料型別:
xs:string,xs:integer,xs:decimal,xs:booleanxs:datexs:dateTime
從第一個非空資料記錄推論資料型別:
樣本值 推斷 XSD 型態 true或falsexs:boolean12345xs:integer19.99xs:decimal2025-01-15xs:date2025-01-15T10:30:00xs:dateTime任何其他值 xs:string子項順序(分隔符位置):
訂單 Meaning 範例( ;)Infix欄位間的分隔符 A;B;CPrefix每個欄位前的分隔符 ;A;B;CPostfix每個欄位後的分隔符 A;B;C;標頭處理:
- 當
hasHeader時true,第一行被視為欄位名稱,而非資料。 - 標頭值會被淨化為有效的 XML 元素名稱。 特殊字元變為
_,前置數字會加上_前綴。 - 若僅有標頭行且無資料記錄,欄位預設為
xs:string。 - 若標頭欄位為空,產生的欄位名稱會退回到
Field{N}。 - 當
hasHeader為false時,欄位會自動命名為Field1、Field2、Field3等,依此類推。
-
限制和已知問題
| 限度 | 說明 |
|---|---|
| 型別推論使用單一記錄。 | 第一個非空資料記錄決定欄位類型。 |
| 僅有單一紀錄類型 | 此動作產生一個重複的記錄結構,且不支援異質記錄佈局。 |
| 無巢狀或階層式記錄 | 產生的結構架構是平面的,意思是你有一個根元素,裡面有一個重複的子記錄和欄位。 |
| 位置邊界不會自動被偵測到。 | 你必須在fieldPositions中提供精確的欄位長度。 |
| 僅限 UTF-8 碼頁 | 產生的結構集合 codepage="65001" ,並不會暴露編碼選擇。 |
| 逸出字元行為是常值。 | 逸出處理會比對常值,且只跳過下一個單一字元。 |
recordName 預設 |
如果未指定,則預設為 {RootElementName}_Record。 |
| 設計工具理由輸入 |
fieldPositions[].justification 僅支撐 Left 且 Right。 |
| 問題 | Resolution |
|---|---|
| 欄位數量錯誤 | 確認與 fieldDelimiterOrder 你的資料格式相符(Infix, Prefix, Postfix)。 |
| 十六進位值僅供輸出 | 雖然產生的 XSD 可能會以十六進位值(例如 0x0D0A)顯示分隔符,並在註解中傳遞 0x-前綴值,但解析並不解碼十六進位輸入。 解析時,務必提供實際的分隔字元(\r\n, \n\t,;)。 |
| 標頭欄位名稱看起來很意外 | 標頭值會被淨化為有效的 XML 名稱。 例如,1st Qty 變成 _1st_Qty。 |
| 記錄分隔符行為 | 若省略 recordDelimiter,剖析時會在實際的換行字元 (\r\n、\n、\r) 上分割。 在產生的 XSD 註解中,記錄分隔符預設為 0x0D0A。 |
故障排除
| 錯誤 | 原因 | Resolution |
|---|---|---|
The flat file sample data content is required. |
content 為零或為空。 |
確保觸發程序或上一個動作提供非空白的一般檔案內容。 |
The schema generation options are required. |
內部錯誤:options 物件為 null。 | 確認工作流程定義是否包含有效的輸入。 |
Failed to generate flat file schema: '{details}'. |
例如,執行時出現意外錯誤,例如編碼或資料格式錯誤。 | 檢查細節或內部錯誤訊息以找出根本原因。 |
The field delimiter is required for delimited record structure. |
recordStructure 是 Delimited ,但 fieldDelimiter 缺失或空。 |
請提供 fieldDelimiter,例如逗號、分號或定位字元。請勿提供十六進位文字,例如 0x09;請提供實際字元,例如 \t。 |
The field positions array is required for positional record structure. |
recordStructure 是 Positional ,但 fieldPositions 缺失或空。 |
為每個欄位提供fieldPositions、length和justification。 |
The flat file sample data contains no data records. |
不存在非空的資料線(或只有標頭在 hasHeader=true時)。 |
在範例內容中至少提供一個非空的資料記錄。 |
Positional field '{N}' exceeds the record length. Record length: '{len}', position: '{pos}', field length: '{fieldLen}'. |
欄位總長度超過記錄長度。 | 調整 fieldPositions 長度,或確認是否 countPositionsByByte 需要更改。 |
測試您的工作流程
要觸發您的工作流程,請依照以下步驟:
在 Request 觸發器中,找到 HTTP POST URL 參數,並複製該 URL。
開啟 HTTP 請求工具,依其指示將 HTTP 請求發送至複製的 URL,包括請求觸發程序所期望的方法。
此範例使用
POST方法與 URL。在請求主體中包含要編碼或解碼的 XML 內容。
工作流程執行結束後,前往工作流程的執行紀錄,檢視 Flat File 動作的輸入與輸出。