使用信封模式在 xmlDisassembler 中进行分批处理,出现空消息时失败

Debatching in xmlDisassembler using envelope schema, failing on empty message

我正在使用信封架构对 BizTalk 接收管道中的传入 xml 消息进行分批处理。对于任何包含我正在尝试取消批处理的子消息的 xml,取消批处理工作正常,但如果消息不包含任何子消息,则会失败。

我已经在 xpath 中的元素的架构中将 "min occurs" 设置为 0 和 nillable = true 以进行分批处理。在下面的示例中,"entry" 和 "resource" 元素将 min occurrence 设置为 0,我认为这会让 debatching 函数在没有要 debatched 的情况下工作。

这是信封架构的注释。

<xs:annotation>
   <xs:appinfo>
     <schemaInfo xmlns="http://schemas.microsoft.com/BizTalk/2003" is_envelope="yes"/>
   </xs:appinfo>
</xs:annotation>
<xs:element name="Bundle">
   <xs:annotation>
      <xs:appinfo>
         <recordInfo xmlns="http://schemas.microsoft.com/BizTalk/2003" body_xpath="/*[local-name()='Bundle' and namespace-uri()='']/*[local-name()='entry' and namespace-uri()='']/*[local-name()='resource' and namespace-uri()='']"/>
     </xs:appinfo>
</xs:annotation>

没有要分批的消息的示例消息

<Bundle >
   <type value="searchset"/>
   <total value="0"/>
</Bundle>

存在子消息时用于分批处理的 xpath 示例。

<Bundle >
   <type value="searchset"/>
   <total value="46"/>
   <entry>
       <resource>
           <Encounter>

任何包含 entry/resource/encounters 元素的消息都成功分批,但不包含 "entry" 元素的消息(没有要分批的消息)抛出以下错误。

Reason: This Disassembler cannot retrieve body nodes using this XPath: "/[local-name()='Bundle' and namespace-uri()='']/[local-name()='entry' and namespace-uri()='']/[local-name()='resource' and namespace-uri()='']". /[local-name()='Bundle' and namespace-uri()='']/[local-name()='entry' and namespace-uri()='']/[local-name()='resource' and namespace-uri()='']

我希望将没有任何内容的消息简单地分解为 "disappear",但我最终在组中心出现错误。任何关于如何消除此错误的想法或建议将不胜感激。

那是因为您将正文指向资源节点,当没有要分批的消息时资源节点甚至不存在。您需要指向始终存在于正文消息出现的信封中的节点。

您可能需要以下 emtpy

<Bundle >
   <type value="searchset"/>
   <total value="0"/>
   <entries/>
</Bundle>

以及以下消息。

<Bundle >
   <type value="searchset"/>
   <total value="46"/>
   <entries>
       <entry>
           <resource>
               <Encounter>

然后将您的 body_xpath 指向条目。

您可以使用下面的 body_xpath 仅提取 'Bundle' 和 'entry' 条记录

body_xpath="/*[local-name()='Bundle' and namespace-uri()=''][*[local-name()='entry' and namespace-uri()=''][count(*)>0]]/*[local-name()='entry' and namespace-uri()='']/*[local-name()='resource' and namespace-uri()='']"

body_xpath="/*[local-name()='Bundle' and namespace-uri()=''][*[local-name()='entry' and namespace-uri()=''][count(*)&gt;0]]/*[local-name()='entry' and namespace-uri()='']/*[local-name()='resource' and namespace-uri()='']"