Azure Logic Appsのフラット ファイルのスキーマをエンコード、デコード、または生成する

適用対象: Azure Logic Apps (従量課金 + Standard)

企業間 (B2B) 統合ワークフローでは、多くの場合、このデータを取引先と交換する前に、XML とフラット ファイル形式の間でデータを変換する必要があります。

このガイドでは、 フラット ファイル の組み込みコネクタ アクションを使用して XML をエンコードまたはデコードし、サンプル データから BizTalk 互換のフラット ファイル スキーマを生成する方法について説明します。

コネクタに関するテクニカル リファレンス

フラット ファイル コネクタには、次のエンコード、デコード、およびスキーマ生成アクションが含まれています。

アクション 従量課金 Standard
フラット ファイル エンコード はい はい
フラット ファイルのデコード はい はい
フラット ファイル スキーマの生成 いいえ はい
ロジック アプリ 環境
従量課金 マルチテナント Azure Logic Apps
Standard シングルテナントの Azure Logic Apps、App Service Environment v3 (Windows プランのみ)、ハイブリッド デプロイ

詳細については、「 統合アカウントの組み込みコネクタ」を参照してください。

前提条件

  • Azure アカウントとサブスクリプション。 無料の Azure アカウントを取得します

  • フラット ファイル操作を使用するロジック アプリのリソースとワークフロー。

    フラット ファイル 操作にはトリガーは含まれません。 ワークフローは、任意のトリガーから開始するか、任意のアクションを使用してソース XML を取り込むことができます。

    この記事の例では、HTTP 要求受信したときにという名前の要求トリガーを使用します

    詳細については、以下を参照してください。

  • エンタープライズ統合と B2B ワークフローの成果物を定義および格納するための統合 アカウント リソース

    • 統合アカウントとロジック アプリ リソースの両方が、同じ Azure サブスクリプションおよび Azure リージョンに存在する必要があります。

    • フラット ファイル操作を開始する前に、従量課金ロジックアプリをリンクするか、スタンダードロジックアプリを統合アカウントにリンクして、取引先や契約などのアーティファクトを操作できるようにする必要があります。 統合アカウントを複数の従量課金プランまたは標準ロジック アプリ リソースにリンクして、同じアーティファクトを共有できます。

    ヒント

    Standard ワークフローで取引先や契約などの B2B 成果物を操作していない場合は、統合アカウントが必要ない可能性があります。 代わりに、スキーマを Standard ロジック アプリ リソースに直接アップロードできます。 どちらの方法でも、同じロジック アプリ リソース内のすべての子ワークフローで同じスキーマを使用できます。 複数のロジック アプリ リソースで同じスキーマを使用するには、統合アカウントを使用してリンクする必要があります。

  • XML コンテンツをエンコードまたはデコードする方法を指定するフラット ファイル スキーマ。

    標準ワークフローでは、 フラット ファイル 操作を使用すると、リンクされた統合アカウントから、またはロジック アプリに以前にアップロードしたスキーマを選択できますが、両方を選択することはできません。

    詳細については、「 統合アカウントにスキーマを追加する」を参照してください。

  • HTTP 要求を送信してソリューションをテストできるツールをインストールまたは使用します。次に例を示します。

    注意

    資格情報、シークレット、アクセス トークン、API キーなどの機密データがあるシナリオでは、必要なセキュリティ機能でデータを保護するツールを必ず使用してください。 このツールはオフラインまたはローカルで動作する必要があり、オンライン アカウントへのサインインやクラウドへのデータの同期は必要ありません。 これらの特性を持つツールを使用すると、機密データを一般に公開するリスクが軽減されます。

制限事項

  • デコードする XML コンテンツは、UTF-8 形式でエンコードする必要があります。

  • フラット ファイル スキーマの場合、含める XML グループの "1 より大きい" 値に設定した max count プロパティ数が多くなりすぎないようにしてください。 max countプロパティ値が1より大きいXMLグループをmax countプロパティが1より大きい別のXMLグループ内にネストしないでください。

  • Azure Logic Apps でフラット ファイル スキーマが解析され、スキーマで次のフラグメントの選択が許可されると、Azure Logic Apps によってそのフラグメントの シンボル予測 が生成されます。 スキーマで許可されるコンストラクトの数が 100,000 を超える場合、スキーマの拡張が非常に大きくなり、リソースが多すぎて時間がかかりすぎます。

スキーマのアップロード

スキーマを作成したら、ワークフローに基づいてスキーマをアップロードします。

フラット ファイル エンコード アクションを追加する

  1. Azure portal で、ロジック アプリ リソースを開きます。

  2. デザイナーで、ワークフローを開きます。

    ワークフローに必要なトリガーやその他のアクションがワークフローにない場合は、最初にそれらの操作を追加します。

    この例では、HTTP 要求受信したときにという名前の要求トリガーを使用します。 トリガーを追加するには、「 ワークフローを開始するトリガーを追加する」を参照してください

  3. デザイナーで、次の 一般的な手順 に従って、 フラット ファイル エンコードという名前の組み込みアクションを追加します。

    アクション情報ウィンドウが開き、[ パラメーター] タブが選択されています。

  4. アクションの Content パラメーターで、エンコードする XML コンテンツを指定します。これは、次の手順に従って、トリガーまたは前のアクションからの出力です。

    1. [コンテンツ] ボックス内を選択し、稲妻アイコンを選択して動的コンテンツ リストを開きます。

    2. 動的コンテンツの一覧から、エンコードする XML コンテンツを選択します。

    次の例は、開いている動的コンテンツ リスト、 HTTP 要求が受信されたとき のトリガーからの出力、およびトリガー出力から選択した 本文 コンテンツを示しています。

    Azure portal、ワークフロー デザイナー、フラット ファイル エンコード アクション、および動的コンテンツ リストとコンテンツがエンコード用に選択された Content パラメーターを示すスクリーンショット。

    Note

    動的コンテンツ リストに Body が表示されない場合は、[ HTTP 要求を受信したとき ] セクション ラベルの横にある [ 詳細を表示] を選択します。 エンコードするコンテンツを [コンテンツ] ボックスに直接入力することもできます。

  5. [スキーマ名] リストからスキーマを選びます。

    デザイナーと開かれたスキーマ名の一覧を示すスクリーンショット。エンコード用のスキーマが選択されています。

    Note

    スキーマ リストが空の場合、原因は次のようになります。

    • ロジック アプリ リソースは統合アカウントにリンクされていません。
    • リンクされた統合アカウントにはスキーマ ファイルが含まれません。
    • ロジック アプリ リソースにはスキーマ ファイルが含まれません。 この理由は、Standard ロジック アプリにのみ適用されます。
  6. アクションに他の省略可能なパラメーターを追加するには、[詳細パラメーター] ボックスの一覧からこれらの パラメーター を選択します。

    パラメーター 説明
    空のノード生成モード ForcedDisabled または HonorSchemaNodeProperty または ForcedEnabled フラット ファイルのエンコードを使用した空のノード生成に使うモード

    BizTalk の場合、フラット ファイル スキーマには、空のノード生成を制御するプロパティがあります。 フラット ファイル スキーマの空のノード生成プロパティの動作に従うことができます。 または、この設定を使用して、Azure Logic Apps で空のノードを生成または省略することもできます。 詳細については、「空の要素のタグ」を参照してください。
    XML 正規化 Yes または No フラット ファイル エンコードの XML 正規化を有効または無効にする設定。 詳細については、「XmlTextReader.Normalization」を参照してください。
  7. ワークフローを保存します。 デザイナーのツール バーで、[保存] を選択します。

フラット ファイルのデコード アクションを追加する

  1. Azure portal で、ロジック アプリ リソースを開きます。

  2. デザイナーで、ワークフローを開きます。

    ワークフローに必要なトリガーやその他のアクションがワークフローにない場合は、最初にそれらの操作を追加します。

    この例では、HTTP 要求受信したときにという名前の要求トリガーを使用します。 トリガーを追加するには、「 ワークフローを開始するトリガーを追加する」を参照してください

  3. デザイナーで、次の 一般的な手順 に従って、 フラット ファイル デコードという名前の組み込みアクションを追加します。

  4. アクションの Content パラメーターで、次の手順に従って、トリガーからの出力または前のアクションからの出力として、デコードする XML コンテンツを指定します。

    1. [コンテンツ] ボックス内を選択し、稲妻アイコンを選択して動的コンテンツ リストを開きます。

    2. 動的コンテンツの一覧から、デコードする XML コンテンツを選択します。

    次の例は、開いている動的コンテンツ リスト、 HTTP 要求が受信されたとき のトリガーからの出力、およびトリガー出力から選択した 本文 コンテンツを示しています。

    スクリーンショットには、Azure portal、ワークフロー デザイナー、フラット ファイル デコード アクション、および動的コンテンツ リストとデコード用にコンテンツが選択されたコンテンツ パラメーターが示されています。

    Note

    動的コンテンツリストに本文が表示されない場合は、[HTTP 要求を受信したとき] セクションラベルの横にある [詳細を表示] を選択します。 デコードするコンテンツを [コンテンツ] ボックスに直接入力することもできます。

  5. [スキーマ名] リストからスキーマを選びます。

    デザイナーとデコード用にスキーマを選択したスキーマ名一覧が開いているところを示すスクリーンショット。

    Note

    スキーマ リストが空の場合、原因は次のようになります。

    • ロジック アプリ リソースは統合アカウントにリンクされていません。
    • リンクされた統合アカウントにはスキーマ ファイルが含まれません。
    • ロジック アプリ リソースにはスキーマ ファイルが含まれません。 この理由は、Standard ロジック アプリにのみ適用されます。
  6. ワークフローを保存します。 デザイナーのツール バーで、[保存] を選択します。

以上で、フラット ファイルのデコード アクションの設定が完了しました。 実際のアプリでは、デコードしたデータを Salesforce などの基幹業務 (LOB) アプリに保存することが必要になる場合があります。 または、そのデコードしたデータを取引先に送信することもできます。 デコード アクションの出力を Salesforce または取引先に送信するには、Azure Logic Apps で使用可能な他のコネクタを使用します。

フラット ファイル スキーマ生成アクションを追加する

フラット ファイル スキーマ生成アクションは、入力として指定したサンプル フラット ファイル コンテンツから実行時に XSD フラット ファイル スキーマを生成します。 生成されたスキーマは、 b:schemaInfob:recordInfob:fieldInfoなどの BizTalk フラット ファイル注釈と互換性があります。

  1. Azure portal で、ロジック アプリ リソースを開きます。

  2. デザイナーで、ワークフローを開きます。

    ワークフローに必要なトリガーやその他のアクションがワークフローにない場合は、最初にそれらの操作を追加します。

    この例では、HTTP 要求受信したときにという名前の要求トリガーを使用します。 トリガーを追加するには、「 ワークフローを開始するトリガーを追加する」を参照してください

  3. デザイナーで、次の 一般的な手順 に従って、 フラット ファイル スキーマ生成という名前の組み込みアクションを追加します。

  4. アクションの Content パラメーターで、フラット ファイルのサンプル コンテンツを指定します。

    トリガーの出力または前のアクションのコンテンツを使用できます。

    1. [コンテンツ] ボックス内を選択し、稲妻アイコンを選択して動的コンテンツ リストを開きます。

    2. 動的コンテンツの一覧から、サンプルのフラット ファイル コンテンツを選択します。

  5. Record 構造体パラメーターを区切りまたは位置指定のいずれかに設定します。

    デザイナーは、動的パラメーター (getFlatFileSchemaGenerationParameters) を使用して、選択した recordStructure 値に基づいて正しいパラメーター セットを表示します。

    次の例は、 区切り レコード構造の構成パラメーターを示しています。

    スクリーンショットは、Azure ポータル、ワークフロー デザイナー、フラット ファイル スキーマ生成アクション、および区切りレコード構造を持つコンテンツ パラメーターを示しています。

    次の例は、 位置指定 レコード構造の構成パラメーターを示しています。

    Azure ポータル、ワークフロー デザイナー、フラット ファイル スキーマ生成アクション、および位置指定レコード構造を持つコンテンツ パラメーターを示すスクリーンショット。

  6. 選択したレコード構造に対して、必須パラメーターと省略可能パラメーターを設定します。

    共通パラメーター (区切りおよび位置指定)

    パラメーター タイプ 必須 説明
    content Any はい フラット ファイルのサンプル データ コンテンツ (文字列またはバイナリ)。
    recordStructure String はい Delimited または Positional のいずれかです。
    hasHeader ブール値 はい true場合、最初のレコード行をヘッダーとして扱い、それらの値を生成されたフィールド名として使用します。
    recordDelimiter String いいえ レコード (行) 区切り記号。 解析では、この値がリテラルで使用されます (16 進デコードは使用されません)。 \r\n\nなどの実際の文字を使用します。 既定の行分割を使用するには、この値を省略します。 生成された XSD は、スキーマ注釈で 16 進値 (0x0D0A) を出力できます。
    recordDelimiterOrder String いいえ 区切り記号の配置: Infix (既定)、 Prefix、または Postfix
    rootElementName String いいえ XSD のルート要素名。 既定値: Root
    targetNamespace String いいえ スキーマのターゲット名前空間。 既定値: http://schemas.microsoft.com/FlatFile/{RootElementName}
    recordName String いいえ 繰り返される子レコード要素の名前。 既定値: {RootElementName}_Record

    区切り記号付き固有のパラメーター

    パラメーター タイプ 必須 説明
    fieldDelimiter String はい コンマ、セミコロン、タブなどのフィールド区切り文字、 ,;\tなどの実際の文字を指定します。 解析ではリテラル文字列比較を使用します (16 進デコードは使用しません)。
    fieldDelimiterOrder String はい 区切り記号の配置: Infix (既定)、 Prefix、または Postfix
    escapeCharacter String いいえ フィールド値に埋め込まれた区切り記号のエスケープ文字。 \"など、実際の文字を指定します。 解析ではリテラル 一致が使用されます (16 進デコードは使用されません)。

    位置指定固有のパラメーター

    パラメーター タイプ 必須 説明
    countPositionsByByte ブール値 はい フィールドの長さをバイト (true) または文字 (false) 単位で測定します。 マルチバイト エンコードに関連します。
    fieldPositions Array はい lengthjustificationを持つフィールド位置オブジェクトの配列。
    fieldPositions[].length Integer はい フィールドの幅を固定しました。
    fieldPositions[].justification String はい パディングの配置を制御します。 値 Left または Right を手動で入力します (大文字と小文字は区別されません)。

    : 現在のデザイナーでは、値を選択するためのリストは提供されません。
  7. ワークフローを実行する前に、区切り記号とエスケープ文字の動作を確認します。

    レコード区切り記号の動作

    特徴 Behavior
    解析 (行の分割) options.RecordDelimiter (生のユーザー値) は、 String.Split()に直接渡されます。 16進数のデコードなし。
    XSDの出力 GetRecordDelimiterForSchema() は次のように変換します。

    - 0xプレフィックスが付いている場合は、パススルーします。
    - 空の場合、既定値は 0x0D0A
    - それ以外の場合は、リテラル文字を 16 進バイトに変換します。
    16進数入力 解析用にいいえ。 0x0D0Aを指定した場合、解析はリテラル テキスト 0x0D0Aで分割しようとします。
    提供する内容 リテラル文字 ( \r\n\n、または完全省略) を使用します。これは、既定では \r\n/\n/\rで分割されます。

    フィールド区切り記号の動作

    特徴 Behavior
    解析 (フィールドの分割) options.FieldDelimiter は、リテラル文字列比較として SplitDelimitedRecord() に直接渡されます。 16進数デコードなし。
    XSD 出力 値が 0x で始まる場合は、 child_delimiter_type="hex"を出力します。それ以外の場合は "char"
    16 進入力 解析用にいいえ。 0x09 は、タブではなくリテラル テキスト 0x09と一致します。
    提供する内容 実際の文字を使用する: ,;\t|など。

    エスケープ文字の動作

    特徴 Behavior
    構文解析 (エスケープ) options.EscapeCharacter はリテラルで比較されます。 一致した場合、次の文字はそのまま消費されます。 16進数デコードなし。
    XSD 出力 値が 0x で始まる場合は、 escape_char_type="hex"を出力します。それ以外の場合は "char"
    16進数入力 解析用にいいえ。 同じリテラル一致動作。
    提供する内容 \"など、実際の文字を使用します。
  8. ワークフローを保存します。 デザイナーのツール バーで、[保存] を選択します。

  9. 生成されたスキーマ出力をデコードまたはエンコードアクションに使用するには、この出力を .xsd ファイルとして手動で保存します。

  10. .xsd ファイルを統合アカウントにアップロードします。 または、標準ワークフローの場合は、ロジック アプリ リソース の Artifacts フォルダーにファイルをアップロードします。 REST API を使用してスキーマ成果物をアップロードすることもできます。

    生成されたスキーマは、アクション出力本文で文字列として返されます。

    @body('Flat_File_Schema_Generation')
    
  11. 必要に応じて、次の定義例を使用します。

    区切り記号付き例

    {
       "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" ]
          }
       }
    }
    
  12. 出力、推論規則、既知の問題を確認します。

    Output:

    プロパティ タイプ 説明
    body String XML 文字列として生成された BizTalk 互換 XSD スキーマ。

    高レベルで生成された XSD コンテンツ:

    • b:schemaInfo standard="Flat File"root_referencecodepage="65001"を含む注釈 (UTF-8)
    • structurechild_delimiterchild_delimiter_typechild_order、および省略可能な escape_charescape_char_type を含むレコードあたりの注釈b:recordInfo
    • b:fieldInfo justificationを持つフィールドごとの注釈と、位置指定スキーマの場合は、pos_offsetpos_length
    • サンプル データからのデータ型推論: xs:stringxs:integerxs:decimalxs:booleanxs:datexs:dateTime

    最初の空でないデータ レコードからのデータ型の推論:

    サンプル値 推論された XSD 型
    true または false xs:boolean
    12345 xs:integer
    19.99 xs:decimal
    2025-01-15 xs:date
    2025-01-15T10:30:00 xs:dateTime
    その他の値 xs:string

    子の順序 (区切り記号の配置):

    Order Meaning 例 (;)
    Infix フィールド間の区切り記号 A;B;C
    Prefix 各フィールドの前の区切り記号 ;A;B;C
    Postfix 各フィールドの後の区切り記号 A;B;C;

    ヘッダーの処理:

    • hasHeadertrueされると、最初の行はデータではなくフィールド名として扱われます。
    • ヘッダー値は、有効な XML 要素名にサニタイズされます。 特殊文字は _になり、先頭の数字は _ プレフィックスを取得します。
    • ヘッダー行のみが存在し、データ レコードが存在しない場合、フィールドは既定で xs:string
    • ヘッダー フィールドが空白の場合、生成されたフィールド名は Field{N}にフォールバックします。
    • hasHeaderfalse の場合、フィールドは Field1Field2Field3 などの名前に自動的に命名されます。

制限事項と既知の問題

制限事項 説明
型推論では、1 つのレコードが使用されます。 最初の空でないデータ レコードによって、列の種類が決まります。
単一のレコードタイプのみ このアクションでは、1 つの繰り返しレコード構造が生成され、異種レコード レイアウトはサポートされません。
入れ子になったレコードまたは階層レコードがない 生成されたスキーマはフラットです。つまり、ルート要素に 1 つの繰り返し子レコードとフィールドがあります。
位置境界は自動的には検出されません。 fieldPositionsで正確なフィールド長を指定する必要があります。
UTF-8 のコードページのみ 生成されたスキーマ セットは codepage="65001" に設定され、エンコーディングの選択は表示されません。
エスケープ文字の動作はリテラルです。 エスケープ処理はリテラル値と一致し、次の 1 文字のみをスキップします。
recordName 既定 指定しない場合、既定で {RootElementName}_Record に設定されます。
デザイナーの理由入力 fieldPositions[].justification では、 LeftRightのみがサポートされます。
Issue Resolution
フィールド数が正しくありません fieldDelimiterOrderがデータ形式 (InfixPrefixPostfix) と一致することを確認します。
16進数は出力専用です 生成された XSD では、区切り記号が 16 進値(たとえば 0x0D0A)として表示され、注釈内では 0x で始まる値がそのまま渡されることがありますが、パース時には 16 進入力はデコードされません。 解析には、必ず実際の区切り文字 (\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 が null または空です。 トリガーまたは前のアクションで空でないフラット ファイルの内容が提供されていることを確認します。
The schema generation options are required. 内部エラー: options オブジェクトが null です。 ワークフロー定義に有効な入力が含まれていることを確認します。
Failed to generate flat file schema: '{details}'. エンコードや形式が正しくないデータなど、予期しないランタイム エラー。 根本原因の詳細または内部エラー メッセージを調べます。
The field delimiter is required for delimited record structure. recordStructureDelimited ですが、 fieldDelimiter が見つからないか空です。 コンマ、セミコロン、タブなどの fieldDelimiterを指定します。 0x09などの 16 進テキストは指定しないでください。 \tなどの実際の文字を指定してください。
The field positions array is required for positional record structure. recordStructurePositional ですが、 fieldPositions が見つからないか空です。 各フィールドに対して、fieldPositionslengthjustification を指定します。
The flat file sample data contains no data records. 空でないデータ行は存在しません (または、 hasHeader=trueの場合はヘッダーのみ)。 サンプル コンテンツに空でないデータ レコードを少なくとも 1 つ指定します。
Positional field '{N}' exceeds the record length. Record length: '{len}', position: '{pos}', field length: '{fieldLen}'. フィールドの長さの合計がレコード長を超えています。 fieldPositionsの長さを調整するか、countPositionsByByteを変更する必要があるかどうかを確認します。

ワークフローをテストする

ワークフローをトリガーするには、次の手順に従います:

  1. 要求トリガーで、HTTP POST URL パラメーターを見つけて、URL をコピーします。

  2. HTTP リクエスト ツールを開き、その手順を使用して HTTP リクエストを リクエスト トリガーで期待されるメソッドを含め、コピーした URL に送信します。

    この例では、URL の POST メソッドを使用しています。

  3. リクエスト本文にエンコードまたはデコードする XML コンテンツを含めます。

  4. ワークフローの実行が完了したら、ワークフローの実行履歴に移動し、 フラット ファイル アクションの入力と出力を調べます。