【问题标题】:BizTalk extract part of XML message to anotherBizTalk 将部分 XML 消息提取到另一个
【发布时间】:2015-09-16 12:25:38
【问题描述】:

我有一个 XML 文件:

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

我需要将 &lt;doc:Request&gt; &lt;/doc:Request&gt; 之间的文本保存到新消息并将其保存为 XML 文件。

【问题讨论】:

    标签: xml biztalk


    【解决方案1】:

    在业务流程中,在消息分配形状中使用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 正文而不是信封。

    【讨论】:

      【解决方案2】:

      在指向 doc:Request(我假设 doc 命名空间已在消息中注册)。然后创建一个消息分配形状并简单地实例化所需类型的新消息(当然,您将需要一个描述 doc:Request 的新模式)

      newMessageType.body = incomingMessage.Request;

      如果你真的必须这样做,你可以通过 xpath 来完成,但请注意,每次执行 xpath 查询时,整个消息都会加载到内存中。如果您的消息很大或者您有大量 xpath 查询,这可能会导致大量开销。此外,如果您的消息很复杂,您的 xpath 可能难以阅读。一个显着的字段总是很容易阅读,如果你更新你的模式,你不需要改变编排。我强烈建议不要使用 xpath!

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

      【讨论】:

      • 这是一个很好的建议,但是以这种方式使用 Distinguished 字段也会将整个消息加载到内存中。在内部,区分字段只是将 XPath 存储在模式而不是编排中的一种方式。
      • 我认为您是对的,因为它使用了 xpath,但我确实相信在管道执行期间会缓存可区分的字段,无论如何都会解析消息并将其加载到内存中。 xpath 根据需要一次又一次地加载消息。因此,即使只使用一个 xpath 查询也会导致性能下降。
      • 啊,我明白你在说什么。是的,使用区分字段可以避免为该消息加载 DOM。
      【解决方案3】:

      xpath 和 distinct 字段将起作用。但是简单的方法不是将带有soapenv命名空间的xml内容结构定义为信封模式,然后让xmldisassmbler完成剩下的事情吗?

      【讨论】:

      • 事实上,它是一个适用于多个具有标准形式的客户端的适配器。但对于每一个我需要提取不同的部分......
      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多