适用范围:Azure 逻辑应用(消耗型 + 标准型)
对于企业到企业(B2B)集成工作流,通常需要在 XML 和平面文件格式之间转换数据,然后才能与贸易合作伙伴交换此数据。
本指南演示如何使用 平面文件 内置连接器操作对 XML 进行编码或解码,以及从示例数据生成与 BizTalk 兼容的平面文件架构。
连接器技术参考
平面文件连接器包括以下编码、解码和架构生成操作:
| Action | 消耗 | 标准 |
|---|---|---|
| 平面文件编码 | 是的 | 是的 |
| 平面文件解码 | 是的 | 是的 |
| 平面文件架构生成 | 否 | 是的 |
| 逻辑应用程序 | 环境 |
|---|---|
| 消耗 | 多租户 Azure 逻辑应用 |
| 标准 | 单租户 Azure 逻辑应用、应用服务环境 v3(仅限 Windows 计划)和混合部署 |
有关详细信息,请参阅 集成帐户内置连接器。
先决条件
Azure 帐户和订阅。 获取 Azure 帐户。
要在其中使用 平面文件 作的逻辑应用资源和工作流。
平面文件 不包含任何触发器。 工作流可以从任何触发器开始,也可以使用任何操作引入源 XML。
本文中的示例使用名为“收到 HTTP 请求时”的请求触发器。
有关详细信息,请参见:
用于定义和存储企业集成和 B2B 工作流工件的 集成帐户资源。
集成帐户和逻辑应用资源必须存在于同一 Azure 订阅和 Azure 区域中。
在开始进行平面文件操作之前,必须将消耗逻辑应用或标准逻辑应用链接到集成帐户,以便处理贸易合作伙伴和协议等项目。 可以将集成帐户链接到多个“消费”或“标准”逻辑应用资源,以共享相同的制品。
小窍门
如果不在标准工作流中使用 B2B 项目(如贸易合作伙伴和协议),则可能不需要集成帐户。 相反,可以将架构直接上传到标准逻辑应用资源。 无论哪种方式,都可以在同一逻辑应用资源中的所有子工作流中使用同一架构。 若要跨多个逻辑应用资源使用相同的架构,必须使用并链接集成帐户。
一个平面文件架构,指定如何对 XML 内容进行编码或解码。
在标准工作流中,平面文件操作允许你从链接的集成帐户中选择架构,或者选择之前上传到逻辑应用的架构,但不能同时从两者中选择。
有关详细信息,请参阅 向集成帐户添加架构。
安装或使用可发送 HTTP 请求以测试解决方案的工具,例如:
- Visual Studio Code,配有从 Visual Studio Marketplace 获取的扩展
- PowerShell Invoke-RestMethod
- Microsoft Edge - 网络控制台工具
- 布鲁诺
- Curl
注意
对于存在敏感数据(例如凭据、机密、访问令牌、API 密钥和其他类似信息)的情况,请务必使用一个符合以下条件的工具:具有可保护数据的必要安全功能,可脱机或本地工作,不会将数据同步到云,并且不需要登录联机帐户。 这样,就可以降低向公众公开敏感数据的风险。
限制
要解码的 XML 内容必须采用 UTF-8 格式编码。
在平面文件架构中,请确保包含的 XML 组没有将太多的
max count属性设置为大于 1 的值。 避免将max count属性值大于 1 的 XML 组嵌套在max count属性值大于 1 的另一个 XML 组中。当 Azure 逻辑应用分析平面文件架构,当架构允许选择下一个片段时,Azure 逻辑应用会生成该片段 的符号 和 预测 。 如果架构允许过多的构造(例如超过 100,000 个),则架构扩展会变得非常大,这会消耗过多的资源和过多的时间。
上传架构
创建架构后,根据工作流上传架构:
消耗: 将架构添加到消耗工作流的集成帐户
添加平面文件编码操作。
在 Azure 门户中,打开你的逻辑应用资源。
在设计器中,打开工作流。
如果工作流没有触发器或工作流所需的任何其他操作,请先添加这些操作。
此示例使用名为请求的触发器“收到 HTTP 请求时”。 若要添加触发器,请参阅 “添加触发器”以启动工作流。
在设计器中,按照以下常规步骤添加名为Flat File Encoding的内置操作。
操作信息窗格打开时,已选择 参数 选项卡。
在动作的Content参数中,请按照以下步骤提供要编码的 XML 内容,此内容是触发器输出或之前动作的输出:
在 “内容 ”框中选择,然后选择闪电图标以打开动态内容列表。
从动态内容列表中,选择要编码的 XML 内容。
以下示例显示了打开的动态内容列表、 收到 HTTP 请求时的 输出以及触发器输出中的所选 正文 内容。
注意
如果 正文 未显示在动态内容列表中,请在 “收到 HTTP 请求时 ”部分标签旁边选择“ 查看更多”。 还可以直接在“内容”框中输入要编码的内容。
从“架构名称”列表中选择你的架构。
注意
如果架构列表为空,原因可能是:
- 逻辑应用资源未链接到集成帐户。
- 链接集成帐户不包含任何架构文件。
- 逻辑应用资源不包含任何架构文件。 此原因仅适用于标准逻辑应用。
若要向作添加其他可选参数,请从 “高级参数 ”列表中选择这些参数。
参数 价值 说明 空节点生成模式 ForcedDisabled 或 HonorSchemaNodeProperty 或 ForcedEnabled 采用平面文件编码时用于生成空节点的模式。
对于 BizTalk,平面文件架构具有控制空节点生成的属性。 可以遵循平面文件架构的空节点生成属性行为。 或者,可以使用此设置让 Azure 逻辑应用 生成或省略空节点。 有关详细信息,请参阅空元素的标记。XML 规范化 “是”或“否” 用于在平面文件编码中启用或禁用 XML 规范化的设置。 有关详细信息,请参阅 XmlTextReader.Normalization。 保存工作流。 在设计器工具栏上选择“保存”。
添加平面文件解码操作
在 Azure 门户中,打开你的逻辑应用资源。
在设计器中,打开工作流。
如果工作流没有触发器或工作流所需的任何其他操作,请先添加这些操作。
此示例使用名为请求的触发器“收到 HTTP 请求时”。 若要添加触发器,请参阅 “添加触发器”以启动工作流。
在设计器中,按照以下 常规步骤 添加名为 Flat File Decoding 的内置动作。
在操作的 内容 参数中,提供要解码的 XML 内容,作为触发器或先前操作的输出,并通过以下步骤进行操作:
在 “内容 ”框中选择,然后选择闪电图标以打开动态内容列表。
从动态内容列表中,选择要解码的 XML 内容。
以下示例显示了打开的动态内容列表、 收到 HTTP 请求时的 输出以及触发器输出中的所选 正文 内容。
注意
如果正文未显示在动态内容列表中,请选择“收到 HTTP 请求”部分标签旁边的“查看更多”。 还可以直接在“内容”框中输入要解码的内容。
从“架构名称”列表中选择你的架构。
注意
如果架构列表为空,原因可能是:
- 逻辑应用资源未链接到集成帐户。
- 链接集成帐户不包含任何架构文件。
- 逻辑应用资源不包含任何架构文件。 此原因仅适用于标准逻辑应用。
保存工作流。 在设计器工具栏上选择“保存”。
你现在已经完成了平面文件解码操作的设置。 在实际应用中,你可能需要将已解码的数据存储在业务线 (LOB) 应用(如 Salesforce)中。 你也可以将已解码的数据发送给贸易合作伙伴。 若要将解码操作的输出发送到 Salesforce 或贸易合作伙伴,请使用 Azure 逻辑应用中提供的其他连接器。
添加平面文件架构生成操作
平面文件架构生成操作在运行时从提供作为输入的示例平面文件内容生成 XSD 平面文件架构。 生成的架构与 BizTalk 平面文件注释(例如 b:schemaInfo, b:recordInfo和 b:fieldInfo)兼容。
在 Azure 门户中,打开你的逻辑应用资源。
在设计器中,打开工作流。
如果工作流没有触发器或工作流所需的任何其他操作,请先添加这些操作。
此示例使用名为请求的触发器“收到 HTTP 请求时”。 若要添加触发器,请参阅 “添加触发器”以启动工作流。
在设计器中,按照以下 常规步骤 添加名为 平面文件架构生成的内置操作。
在该操作的 内容 参数中,提供平面文件的示例内容。
您可以使用触发器输出或前一个操作中的内容:
在 “内容 ”框中选择,然后选择闪电图标以打开动态内容列表。
从动态内容列表中,选择示例平面文件内容。
将 Record 结构 参数设置为 “带分隔符 ”或 “位置”。
设计器使用动态参数 (
getFlatFileSchemaGenerationParameters) 根据所选recordStructure值显示正确的参数集。以下示例显示了 带分隔符 记录结构的配置参数:
以下示例显示了 Positional 记录结构的配置参数:
对于所选记录结构,请设置必需参数和可选参数。
通用参数(分隔型和位置型)
参数 类型 必需 说明 contentAny 是的 平面文件示例数据内容(字符串或二进制文件)。 recordStructureString 是的 Delimited或Positional。hasHeader布尔 是的 如果 true,请将第一条记录行视为标头,并将这些值用作生成的字段名称。recordDelimiterString 否 记录(行)分隔符。 分析以字面意思使用此值(无十六进制解码)。 使用实际字符,例如 \r\n或\n。 若要使用默认行拆分,请省略此值。 生成的 XSD 可以在架构注释中发出十六进制值(0x0D0A)。recordDelimiterOrderString 否 分隔符放置: Infix(默认值),Prefix或Postfix。rootElementNameString 否 XSD 的根元素名称。 默认值: Root。targetNamespaceString 否 架构的目标命名空间。 默认值: http://schemas.microsoft.com/FlatFile/{RootElementName}recordNameString 否 重复子记录元素的名称。 默认值: {RootElementName}_Record带分隔符的参数
参数 类型 必需 说明 fieldDelimiterString 是的 字段分隔符,如逗号、分号、制表符、提供实际字符,例如 ,,;或\t。 分析使用文本字符串比较(无十六进制解码)。fieldDelimiterOrderString 是的 分隔符放置: Infix(默认值),Prefix或Postfix。escapeCharacterString 否 字段值中内嵌分隔符的转义字符。 提供实际字符,例如 \或"。 分析使用文本匹配(无十六进制解码)。位置特定参数
参数 类型 必需 说明 countPositionsByByte布尔 是的 按字节( true)或字符(false)计量字段长度。 与多字节编码相关。fieldPositionsArray 是的 字段位置对象的数组,每个对象都有 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文件上传到集成帐户。 或者,对于标准工作流,请将文件上传到逻辑应用资源 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 生成了与 BizTalk 兼容的 XSD 架构作为 XML 字符串。 高级别生成的 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:decimalxs:boolean、xs:date、xs:dateTime
第一条非空数据记录中的数据类型推理:
示例值 推断的 XSD 类型 true或falsexs:boolean12345xs:integer19.99xs:decimal2025-01-15xs:date2025-01-15T10:30:00xs:dateTime任何其他值 xs:string子级顺序(分隔符位置):
Order 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。 |
| Issue | 解决方案 |
|---|---|
| 字段数量错误 | 验证是否fieldDelimiterOrder与数据格式(Infix、、PrefixPostfix) 匹配。 |
| 十六进制值仅用于输出 | 虽然生成的 XSD 可能会将分隔符显示为十六进制值(例如 0x0D0A),并在批注中传递 0x前缀值,但分析不会解码十六进制输入。 若要分析,请始终提供实际的分隔符字符(\r\n、、\n、\t,、;)。 |
| 标头字段名称看起来意外 | 标头值已被规范化为有效的 XML 名称格式。 例如,1st Qty 将变为 _1st_Qty。 |
| 记录分隔符行为 | 如果省略 recordDelimiter,则解析时会按实际的换行字符(\r\n、\n、\r)进行分割。 在生成的 XSD 批注中,记录分隔符默认为 0x0D0A。 |
故障排查
| Error | 原因 | 解决方案 |
|---|---|---|
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. |
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 应更改。 |
测试工作流
要触发工作流,请执行以下步骤:
在 请求 触发器中,找到 HTTP POST URL 参数,并复制 URL。
打开 HTTP 请求工具,并按照其说明向复制的 URL 发送 HTTP 请求,其中包含 Request 触发器所要求的 HTTP 方法。
此示例将
POST方法与 URL 配合使用。在请求正文中包含要编码或解码的 XML 内容。
工作流运行完成后,转到工作流的运行历史记录,并检查 平面文件 操作的输入和输出。