提取内部模式XML值以映射到业务流程的入站模式的方法

时间:2008-11-01 07:07:03

标签: biztalk biztalk2006r2

有几个应用程序系统将消息作为其工作过程的一部分传递给对方。由于旋转事务完整性的技术限制,应用程序数据和消息传递都被提交到单个大型机DB2数据库中。消息不会直接传递给BizTalk服务器(2006 R2);由BTS在以后从DB2数据库中提取消息。

DB2数据库中的消息队列表有几个字段。关键字段是MESSAGE_DATA列 - 实际消息;它本身就是XML内容。当使用DB2适配器从表中查询记录时,传入的模式就像

CORRECTION UPDATE:DB2Message架构是基于属性的;我之前把它误认为是基于元素的。

<DB2Message MESSAGE_DATA="&lt;InternalXML&gt; ........ &lt;/InternalXML&gt;"
 MESSAGE_DATE="2008-1-1 00:00:00" MESSAGE_ID="GUID" TXN_ID="GUID" .... other attrib />

业务流程使用架构

<EAIMessage>
 <Header>
  <ServiceID>
  <MessageID>
  ....
  <Mode>
 </Header>
 <Body>
  <RawXML>
 </Body>
</EAIMessage>

业务流程将使用Header中的几个提升字段来制定路由和处理决策。问题是,那些头字段实际上来自存储在DB2Message的MESSAGE_DATA中的内部XML内容。

在这个单一级别,当将两个模式放在一起时,Mapper不知道MESSAGE_DATA中的这个底层XML模式。应该有一些XPath functoid可以进一步向下钻取MESSAGET_DATA元素以进行正确的值映射,但之前没有处理过大量的XML和XSLT应用程序,我无法看到可用的功能可以帮助我执行此任务

之前有人做过这样的数据提取和映射吗?

更新。根据要求,在MESSAGE_DATA中,内部XML可能看起来像

<Message>
    <Id>e86970f4-0455-4535-8e65-a06eb7aaef8a</Id>
    <SenderApp>999</SenderApp>
    <ReceiverApp>2000</ReceiverApp>
    <ServiceId>8798973454</ServiceId>
    <Mode>P</Mode>
    <MuxId></MuxId>
    <ExceptionCode></ExceptionCode>
    <ExceptionMessage></ExceptionMessage>
    <Body>
        <WorkItem xmlns="http://tempuri.org/WorkItem.xsd">
            <ServiceHeader xmlns="http://tempuri.org/Service.xsd">
                <ID_UPDATED_BY>username</ID_UPDATED_BY>
                <ID_HISTORY_REF>xxxxxxx</ID_HISTORY_REF>
                <SESSION_ID>sessionID</SESSION_ID>
                <DT_LAST_UPDATE>timestamp</DT_LAST_UPDATE>
                <TM_LAST_UPDATE>time</TM_LAST_UPDATE>
            </ServiceHeader>
        </WorkItem>
    </Body>
</Message>

2 个答案:

答案 0 :(得分:1)

克里斯是正确的 - 它似乎只是你真正关心的信息的内在部分,外部只是一个信封。

因此我建议你创建一个反汇编程序,它在接收管道中将删除信封(你可以将它作为一个上下文属性保存在其中并且/或者从它中提取一些位作为单独的属性,如果你需要对它们采取行动),并提取将成为发布到消息框中的消息的内部部分。

现在真正的消息是一个处理过的,但是发送端口和任何订阅者的其余部分,以及您从信封中获得的任何信息都会通过其上下文流动。

现在您可以完全访问邮件及其属性;如果适用,您可以为此消息部署一个模式,该模式可以具有可以快速访问某些(简单类型)节点的区分属性。或者你可以使用xlang / s xpath来提取信息。

如果您的嵌入式消息位于信封中的元素内,您当然可以使用内置的XmlDisassembler来完成所有这些操作(您只需要正确部署模式并相应地配置组件;我不确定如何这适用于属性中包含的消息,但它可能值得一试。

最糟糕的情况是,您正在编写一个自定义反汇编程序,它会剥离信封,然后调用内置反汇编程序来处理内部消息,但这也不应该太费力。

答案 1 :(得分:0)

我建议查看信封模式,以便从外部消息中“解开”内部消息。我相信信封可以在通过接收管道移动时将信封中的属性提升到内部消息的上下文中。然后,内部消息必须映射到其自己类型的模式。然后,您将能够根据模式类型进行路由或做出决策,并使用XPath来挑选您需要的任何内容。没有尝试过所有这些东西,但我确信存在这样做的功能。