任意 XPath 属性处理程序(BizTalk Server 示例)

任意 XPath 属性处理程序(BizTalk Server 示例)演示了如何编写自定义管道组件以升级提交到 BizTalk Server 的 XML 文档中的特定属性。 您可以使用示例中包含的功能创建自定义常规组装器和拆装器组件以评估 XPath 表达式。

本示例的用途

本示例包括要处理的采购订单 (PO) XML 文档 DocInstance.xml。 本示例将使用以下步骤处理 DocInstance.xml:

  1. DocInstance.xml 由 BizTalk Server 接收端口检索并由称为“任意 XPath 属性处理程序”的自定义管道组件进行处理。

  2. 任意 XPath 属性处理程序组件使用 PO 架构中定义的任意 XPath 表达式提升所有 <Price> 和 <Quantity> 元素。 XPath 表达式还包含与 PO 文档根元素的不明确的子元素一起使用的位置构造。

  3. 任意 XPath 属性处理程序组件可确定消息类型并将其升级到消息上下文中。

  4. 然后,该组件将具有已升级元素的 XML 文档发送到业务流程以便进一步处理。

  5. 该业务流程将访问 PO 文档中的已升级元素并计算 PO 中项的总数。

  6. 该业务流程将创建包含原始 PO 中的信息及已更新总数的新 PO 文档。

  7. 新 PO 文档将写入 \Output 目录中的文件。

本示例所在的位置

<示例 Path>\Pipelines\ArbitraryXPathPropertyHandler

下表显示了本示例中的文件及其用途说明:

文件 说明
ArbitraryXPathPropertyHandler.sln 自定义管道组件解决方案文件。
ArbitraryXPathPropertyHandler.resX 资源文件。
ArbitraryXPathPropertyHandlerComp.cs 主要组件实现。
AssemblyInfo.cs 程序集信息。
Cleanup.bat 示例清理文件。
PromotingMap.cs 属性升级为本机 CLR 类型的映射实现。
PropertyAttributes.cs 自定义属性、属性说明符和 ICustomTypePropertyDescriptor 实现。
SchemaMap.cs 从消息类型映射到 IDocumentSpec 的架构,用于解决架构不明确问题。
Setup.bat 生成和安装示例管道组件。
VirtualStream.cs 虚拟流实现。
SeekableReadOnlyStream.cs 可查找的只读流实现。
ArbitraryXPathSample.sln 示例业务流程解决方案文件。
CalculateTotalAmount.odx 示例业务流程。
PODocument.xsd 采购订单架构。
DocInstance.xml 示例采购订单实例。

生成和初始化此示例

此示例旨在在同一台计算机上运行SQL Server BizTalk Server环境中运行。 如果您的环境与此配置不匹配,则您必须修改任意 XPath 属性处理程序(BizTalk Server 示例)以指向正确的 SQL Server 计算机。

重要

Setup.bat 假定 Microsoft Windows 安装目录为 C:\Windows。 如果 Windows 安装在其他目录中,则必须修改 ArbitraryXPathPropertyHandler.csproj 文件以反映 Microsoft.BizTalk.Component.Utilities 程序集在全局程序集缓存中的位置。 在 Reference 元素中,将 SYSTEMROOT> 更改为<安装 Windows 的位置, (例如 C:\WINNT\) 。

<Reference  
  Name = "Microsoft.BizTalk.Component.Utilities"  
  AssemblyName = "Microsoft.BizTalk.Component.Utilities"  
  HintPath = "<SYSTEMROOT>\assembly\GAC\Microsoft.BizTalk.Component.Utilities\3.0.1.0__31bf3856ad364e35\Microsoft.BizTalk.Component.Utilities.dll"  
/>  

使用以下过程生成并初始化任意 XPath 属性处理程序(BizTalk Server 示例)。

构建和初始化此示例

  1. 在命令窗口中,将 cd) (目录更改为以下文件夹:

    <示例 Path>\Pipelines\ArbitraryXPathPropertyHandler

  2. 运行 Setup.bat 文件,该文件将执行以下操作:

    • 生成任意 XPath 属性处理程序管道组件。

    • 将生成的管道组件复制到 <安装路径>\管道组件目录。

    • 创建发送端口和接收端口。

    • 创建示例中使用的输入和输出目录。

    • 安装示例 BizTalk Server 业务流程 ArbitraryXPathSample。

    • 将端口绑定到示例业务流程。

    • 启动业务流程。

    注意

    在生成和初始化期间不应报告任何错误。 如果出现任何错误,请确保安装了所有所需软件并且路径中的 Microsoft 生成工具可用。

    注意

    若要撤消 Setup.bat 所做的更改,必须先从 BizTalk Server 管理控制台停止并重启主机实例。 然后运行 Cleanup.bat。 第二次运行 Setup.bat 之前,必须运行 Cleanup.bat。

运行本示例

使用以下过程运行任意 XPath 属性处理程序(BizTalk Server 示例)。

运行本示例的步骤

  1. 将采购订单 (PO) 文件 DocInstance.xml 复制到 \Input 目录。 接收端口提取该 PO 文件,并将 XML 数据发送到任意 XPath 属性处理程序管道组件。

  2. 查看 \Output 目录中的内容。 请注意,创建了一个新文件,它包含复制到 \Input 目录的 DocInstance.xml 文件的所有信息。 文件中的区别在于,现在 <TotalAmount> 元素已填充 PO 的总量。

注释

规范 XPath 表达式是简单的表达式,例如“/*[local-name () ='element-name' and namespaceURI () =''http://MyUri.org]/*[local-name () ='element-name']/@*[local-name='attribute-name']”。

任意 XPath 表达式是复杂表达式,例如“//element-name//*[local-name()='element-name' and position()=2]”。 事实上,如果架构的 XPath 正文或某个 XPath 属性中使用了非规范化 XPath,则您将收到一个运行时错误,指出 BizTalk Server 不支持非规范化 XPath 表达式。 支持任意 XPath 表达式的解决方案是,创建支持任意 XPath 正文和任意 XPath 属性表达式的自定义拆装器和组装器组件。

实现 IComponent.Execute 时,此示例在自定义管道组件中使用以下步骤序列:

  1. 通过输入消息正文部分流创建虚拟可查找的流。 (因为输入消息可能较大并且该流可能不可查找,它应具有较小的内存需求量并且能够更改流位置。)

  2. 为输入消息创建一个新的传出消息和新的正文部分,将虚拟流分配给新正文部分,克隆正文部分属性,然后克隆消息上下文。

  3. 为输入消息获取一个架构或基于设计时指定的架构。

  4. 将流加载到 System.Xml 实例中。XmlDocument

  5. 演练升级属性和可分辨字段并将其升级到或写入传出消息的消息上下文。

  6. 返回传出消息。

  7. 将传出消息写入文件。

另请参阅

管道(BizTalk Server 示例文件夹)