用一种非常简单的方式,一张地图(。BTM 文件)是使用一种称为 XSLT 的转换语言从一个可扩展标记语言文档转换成另一个或多个可扩展标记语言文档。这些映射在 BizTalk 中用于以下位置:
- 接收端口
- 发送端口
- 内部管弦乐队
地图是 BizTalk 的核心概念;他们负责对消息数据进行任何必要的转换,这些转换由您想要集成的不同系统进行交换。这些映射是在 Visual Studio 2010 中使用 BizTalk 映射器工具开发的。该工具有一个开发人员友好的界面,允许您拥有地图使用的输入和输出模式的树形结构视图。
图 26: BizTalk 映射器工具
映射器编辑器分为七个不同的区域,每个区域代表映射和模式节点的不同行为和配置。可用区域包括:
- Functoids 面板,其中有所有可用的 functoid 供您在地图中使用。
- 网格面板,这里显示了所有的映射和转换。对于逻辑组织,BizTalk 允许您将映射分成页面,这些页面位于网格的底部。
- 源模式结构。这代表您在此地图上收到的消息。让所有节点都可供您映射和转换。
- 目标模式结构。这代表您在此地图上的外发邮件。让所有节点都可用,您将从这些节点映射转换后的节点。
- 输出面板。在这里,您将看到地图验证和测试的结果。这个工具是一种非常重要的调试形式,您可能已经从。NET 项目。
- 解决方案浏览器。这是所有 Visual Studio 项目的通用面板。它代表您的 BizTalk 应用程序的解决方案结构。
- 属性窗口。这也是所有 Visual Studio 项目的共享窗口。它显示选定对象的所有可用属性。
图 27:映射器概述
将地图添加到项目中非常容易,因为地图是 SDK 工件。要添加地图,请在解决方案资源管理器中右键单击您的项目,选择添加 > 添加新项目,然后选择地图。不要忘记在添加新项目画面中给它一个描述性的名称。一旦添加了新的映射,BizTalk 将打开映射编辑器,没有任何模式和转换,如图 28 所示。
图 28:空地图
创建空映射后,是时候将源和目标模式添加到其中,以便开始映射和转换。重要的是回顾一下,这两个模式现在都应该已经创建或添加到您的项目中了。
如图 28 所示,空映射在源和目标模式中都有链接,允许您不仅从项目中选择模式,还可以从解决方案中引用的任何其他项目中选择模式。当您点击开源模式或开放目标模式时,系统会提示您选择模式的位置。
图 29:向项目添加模式
对于我们的例子,我们将简单地添加我们的biztalk。源模式作为源模式和商务对话简洁。目的地作为我们的目的地模式。值得注意的是,我们已经用名称空间配置了我们的模式,因此 BizTalk 创建了两种新类型的消息,这个名称空间与模式名连接在一起,创建了所谓的模式的完全限定名。这用于标识订户订阅的消息类型。
将源模式和目标模式添加到映射后,可以通过将节点从源模式链接到目标模式来开始实现简单的转换规则。链接是将源架构中的数据项与目标架构中的数据项相关联的方式。通常,在完整的映射中,源模式和目标模式之间有许多链接。所有这些链接一起指定了如何将源实例消息中的数据转换成语义等价但语法不同的目标实例消息。
在 BizTalk 中链接节点是一个非常简单的操作,这是一个拖放事件,将自动在一个源节点和另一个目标节点之间创建链接。要链接节点,请单击鼠标指针并将其拖动到目标节点。图 30 表示地图中两个节点之间的链接。
图 30:链接节点
BizTalk 还为您提供了加速映射的机制。在这种情况下,我们只是映射一个节点,但是假设您有包含数百个节点的源和目标模式,并且它们都有相同的名称,我们会失去将它们一个接一个地连接起来的想法。为了加速映射,您可以在执行链接时单击CTRL;完成拖放后,BizTalk 将为您提供以下选项:
图 31:链接选项
这些选项可能会成为您在节点映射中最好的朋友,因为它们会为您节省大量时间。表 4 总结了这些链接选项。
表 4:链接选项
名字 | 描述 |
---|---|
直接链路 | 使用这种技术,BizTalk 映射器将源架构中的记录链接到目标架构中的选定记录。 |
按名称链接 | 使用这种技术,BizTalk Mapper 会尝试根据链接的记录节点中相应节点的名称来匹配链接的记录节点中的记录和字段节点,而不管它们的结构如何。 |
按结构链接 | 使用这种技术,BizTalk Mapper 会尝试根据记录节点的结构匹配被链接的记录节点中的记录和字段节点,而不考虑这些结构中对应节点的名称。 |
批量复制 | “批量复制”functoid 使您的映射可以使用包含任何和任何属性元素的模式。 |
例如,让我们使用“按名称链接”选项。图 32 显示了使用这个选项只映射一个节点的结果;两个节点都是自动链接的。
图 32:按名称链接
有时,BizTalk 映射中的直接链接不足以尊重目标模式格式,我们需要应用一些数据转换或转换。它可以是节点到特定类型的连接或转换,可能需要几个操作来满足这些目标模式的要求。
Functoids 是对这个问题的响应,封装了用于对源节点值执行所有必需处理的转换逻辑,以便与目标节点格式和值一起工作。BizTalk 有许多 functoidss,这些 functoid 可以简单到连接字符串来相乘值,或者循环遍历 XML 文件中的重复记录。
在映射器中,您可以在工具箱中找到所有可用的 functoidss,您可以在地图编辑器工具的左侧识别这些 functoid。当您打开工具箱时,您会发现这些 functoid 被划分为代表该 functoid 响应的操作类型的类别。
图 33:Functoid 类别
一旦您确定了要使用的 functoid,将其添加到地图并配置其行为的过程对于所有 functoid 都是相同的;您只需要将该 functoid 拖放到映射中,将源节点链接到该 functoid,双击该 functoid 以配置任何其他设置,并将该 functoid 链接到目标节点。
在下面的示例中,我们希望将员工的地址与国家/地区连接起来,但用分号分隔,然后将其连接到目标节点。第一步是通过将 concatenate functoid 拖到地图的中心来添加它,如图 34 所示。
图 34:添加连接运算质
添加“连接”functoid 后,BizTalk 将在其顶部显示一条警告,指示该 functoid 没有输出节点。理解 functoid 可能不需要输入节点,但它必须链接到至少一个输出节点,这一点很重要。现在我们需要将“地址”和“国家”节点链接到“连接”functoid,并将该 functoid 链接到目标节点。如图 35 所示,警告不再存在。
图 35:正确链接的 functoid
最后,您需要在两个节点之间添加分号作为分隔符。为此,双击 functoid 的顶部,您将看到配置屏幕。请记住,所有 functoids 都有此行为;如果您需要配置任何其他设置,请双击它并配置您需要的设置。双击它后,您将看到类似图 36 的内容,其中您可以看到我在节点之间添加了分号。
图 36:设置连接 functoid
该 functoid 不仅允许您将字符串添加到连接逻辑中,还允许您对节点重新排序,甚至从中删除一些节点或字符串。
这种 BizTalk functoid 机制允许开发人员非常容易地维护和开发映射和消息转换。
虽然 concatenate functoid 很容易使用,但是还有其他更复杂的 functoid。下表将显示所有可用的现成 functoids 及其类别。
字符串函数
此类 functoid 表示所有可用于字符串操作的 functoid。所有这些 functoid 都有一个字符串作为返回对象,它们的输入可能是来自源架构的输入节点或静态字符串,在 functoid 配置屏幕中配置为输入参数。表 5 描述了此类别中可用的 functoids。
表 5:字符串 Functoids
高级功能
这类 functoids 允许您对其输入执行高级操作。其中一些函数返回的输出可以用作另一个 functoid 的输入,或者直接发送到目标。在此类别中,您有以下可用 functoids:
表 6:高级函式
转换 Functoids
这类 functoid 允许您对输入参数执行转换,并将返回输出用作另一个 functoid 的输入,或者直接发送到目标架构。在此类别中,您有以下可用 functoids:
表 7:转换函式
形状 | 名字 | 描述 |
---|---|---|
![]() |
ascii 到字符 | 返回转换为 ASCII 表中包含该数字的字符的数字 |
![]() |
字符到 ASCII | 返回转换为 ASCII 表示形式的输入参数(字符串)的第一个字符 |
![]() |
十六进制的 | 返回转换为十六进制值的输入的整数部分。假设输入是十进制的。 |
![]() |
八进制的 | 返回转换为八进制值的输入的整数部分。假设输入是十进制的。 |
累积 Functoids
累积 functoids 允许您对源架构中重复出现的节点执行操作,并根据输入节点的所有出现情况输出一个值。在此类别中,您有以下可用 functoids:
表 8:累计 Functoids
| 形状 | 名字 | 描述 |
| | 累计平均值 | 对输入值执行平均计算,并将结果作为十进制值返回 |
|
| 累积连接 | 串联字符串输入的所有匹配项,将输出作为一个字符串返回 |
|
| 累积最大值 | 返回输入值的最大值 |
|
| 累积最小值 | 返回输入值数量的最小值 |
|
| 累计总和 | 返回所有输入值的总和 |
数据库功能
此 functoid 类别允许您对数据库执行查找操作,以便从中获取存储值,然后在映射中添加和使用它们。在此类别中,您有以下可用 functoids:
表 9:数据库 functoids
日期/时间 Functoids
这些类型的 functoids 允许您对输入参数执行日期/时间操作,或者生成要添加到目标节点的日期/时间对象类型。它们的输出可以用作另一个 functoid 的输入,或者直接发送到目标。在此类别中,您有以下可用 functoids:
表 10:日期/时间函式
形状 | 名字 | 描述 |
---|---|---|
![]() |
添加天数 | 使用它们的两个输入参数,并将第二个参数中指定的天数与第一个参数中指定的日期相加,从而返回一个新日期。 |
![]() |
日期 | 返回当前日期,没有输入参数。 |
![]() |
时间 | 返回当前时间,没有输入参数。 |
![]() |
日期和时间 | 返回当前日期和时间,没有输入参数。 |
逻辑 Functoids
这类 functoid 对其输入执行逻辑运算,并返回一个布尔值,该值可以在以后用作另一个 functoid 的输入,或者指示编译器如何构造生成的 XSLT。它们通常用于定义映射内部的规则。
表 11:逻辑函式
数学函数
这些 functoids 几乎就是你的转换计算器;它们允许您对其输入执行数学运算,并返回可用作另一 functoid 的输入或直接发送到目标架构的输出。在此类别中,您有以下可用 functoids:
表 12:数学函式
科学功能
这些 functoid 用于对其输入执行科学的数学运算,并返回一个输出,该输出可用作另一个 functoid 的输入或直接发送到目标架构。这些是数学范畴 functoids 的补充,它们被分开是因为它们代表高级数学运算。在此类别中,您有以下可用 functoids:
表 13:科学功能
在开发我们的映射时,我们将对输入模式执行转换,以尊重我们的输出模式。这意味着将通过我们的应用程序接收端口接收或在业务流程中处理的每个 XML 文档都将根据相同的转换进行转换。
可以想象,在没有任何测试的情况下部署我们的映射是危险的,因为我们可能会向我们的贸易伙伴发送无效消息。BizTalk 提供了一种机制来模拟我们的地图的执行,基于输入的 XML 或平面文件文档,并在 Visual Studio 中检索预期的 XML 或平面文件。您还可以检查映射引擎生成的 XSLT。重要的是要理解,尽管 BizTalk 验证了 XSLT 的结构和语法,但作为开发人员,您的工作是验证生成的 XML 文档是否符合您的贸易伙伴的要求。
要使用此工具,您只需在解决方案资源管理器中右键单击您的地图,然后选择测试地图选项。
图 37:测试图菜单
然后,BizTalk 将生成一个输出文档,您可以通过单击输出窗口中的文件位置来访问该文档。
图 38:测试图
虽然您可以直接使用该工具而无需定制,但是映射属性允许您在不同的条件下执行测试,例如定制的输入 XML 来测试真实的示例场景。为此,您可以访问地图属性并将属性测试地图输入更改为 XML ,然后在测试地图输入实例属性中配置您的测试 XML 文件路径。
图 39:定制测试图执行
映射验证是开发 BizTalk 映射时常用的简单操作。虽然测试映射有助于可视化 XML 文档上的映射转换结果,但此功能会验证转换的一致性(例如,如果有一个必需的节点没有链接,或者如果有多个链接指向同一个节点)。要使用此选项,请在解决方案资源管理器中右键单击地图,然后选择验证地图。
图 40:验证地图
映射验证执行结束后,BizTalk 将生成一个输出,指示是否有错误或警告,如果成功,则指示没有错误或警告,并生成 XSLT 来执行映射。无论成功与否,这个 XSLT 都会提供给你。在输出窗口中查找包含路径的行,您可以打开它:
图 41:XSLT 文档的输出
打开文件后,如果您已经处理过 XSLT 文档,那么语法会很熟悉。它将模式中的所有节点用作输出,并为每个节点提供转换逻辑,以及用于从源模式中获取所需节点的 XPath 引用。
图 42:图 43 XSLT 生成
因为 BizTalk 基于。NET 框架,您还会发现用于任何转换或编程逻辑的 C# 代码块。因为我在这个映射中只使用了连接 functoid,XSLT 代码只有 C# 代码函数来执行它的逻辑。
图 43:在 XSLT 中连接 functoid C# 代码
当验证和测试不足以发现错误或评估输出文档时,通常使用地图编辑器中的调试选项。这样,您就可以通过执行映射中定义的所有映射转换,逐步调试 XML 文档的构建。这个特性非常类似于 C#/中的任何调试。NET 应用程序开发,所以如果您熟悉断点、单步执行和观察者,这对于您来说几乎是一样的。要使用该功能,在解决方案资源管理器中右键单击地图,然后选择调试地图选项,如图 44 所示:
图 44:调试图
单击调试映射选项后,BizTalk 将打开一个新窗口,您可以在其中定义断点,并在结果面板中查看步骤执行的结果。图 45 显示了这个调试窗口。
图 45:调试窗口
上图显示了调试窗口中的两个独立面板。在面板 A 上,基于为映射生成的 XSLT,您可以定义断点(调试器将在下一次执行时停止)。在面板 B 上,您有一个结果面板,其中您的 XML 文档是根据您在 XSLT 代码执行中的步骤创建的。