BizTalk将XML消息的一部分提取到另一个

时间:2015-09-16 12:25:38

标签: xml biztalk

我有一个XML文件:

<soapenv:Envelope>
   <soapenv:Header/>
   <soapenv:Body>
      <doc:Request>
        ... some XML text as flat text or like XML ...
      </doc:Request>
   </soapenv:Body>
</soapenv:Envelope>

我需要在<doc:Request> </doc:Request>之间将文本保存到新邮件中并将其另存为XML文件。

3 个答案:

答案 0 :(得分:3)

在业务流程中,在消息分配形状中使用xpath()

msgExtracted = xpath(msgSoap, "/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='Request']");

在自定义管道组件中,将pInMsg.BodyPart.GetOriginalDataStream()加载到XmlReader,然后加载ReadToFollowing("Request", "namespace_for_doc_here");节点,然后使用reader.ReadSubtree()获取它并将其作为消息返回。

最后,因为您很可能无论如何都在使用基于WCF的适配器,您可以在适配器设置中指定消息的Body XPath - 或者只是告诉适配器包含SOAP正文而不是信封。

答案 1 :(得分:2)

在传入消息架构中创建一个可分辨字段(确保您正在获取最佳实践的架构副本),该字段指向 doc:Request (我假设< strong> doc 命名空间已在消息中注册)。然后创建一个消息分配形状并简单地实例化一个所需类型的新消息(当然,您需要一个描述 doc:Request 的新模式)

newMessageType.body = incomingMessage.Request;

如果你真的必须,你可以通过xpath来做,但请知道每次执行xpath查询时,整个消息都会加载到内存中。如果您的消息很大或者您有大量的xpath查询,这可能会导致巨大的开销。此外,如果您的消息很复杂,则您的xpath很难阅读。如果区分字段总是易于阅读,并且如果更新架构,则不需要更改编排。我强烈建议不要使用xpath!

注意 如果您的任务的唯一目的是从邮件中获取该位并将其保存为您在此处所述的XML文件,那么您甚至不需要编排。您可以将地图添加到接收端口,该端口转换为新的消息类型,并使用发送端口订阅输出 doc:Request 消息,该消息通过文件适配器进行简单保存。

答案 2 :(得分:1)

xpath和distinguished字段将起作用。但是,使用soapenv名称空间作为包络模式定义xml内容结构的简单方法是不是很简单,那么让xmldisassmbler完成剩下的工作吗?