1. ホーム
  2. xpath

[解決済み] エンベロープスキーマを使用したxmlDisassemblerでのデバッチが、空のメッセージで失敗する。

2022-02-08 14:02:49

質問

BizTalk受信パイプラインで、エンベロープスキーマを使用して受信するxmlメッセージをデバッグしています。デバッチは、私がデバッチしようとしているサブメッセージを含むすべてのxmlに対してうまく機能しますが、メッセージにサブメッセージが含まれていない場合は失敗します。

デバッチ用の xpath にある要素について、スキーマで "min occurs" を 0 に、nillable = true に設定しました。以下のサンプルでは、"entry" と "resource" の要素に min occurs が 0 に設定されており、デバッグするものがないときにデバッチ機能が動作するようになると思いました。

エンベロープスキーマのアノテーションはこちらです。

<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" 要素を含まないメッセージ (デバッグするメッセージがない) は、以下のエラーを投げます。

<ブロッククオート

理由 このディスアセンブラは、次の XPath を使用してボディノードを取得することができません: "/ [ローカルネーム()='Bundle'かつ名前空間uri()=''】/。] [local-name()='entry' and namespace-uri()='']/ [local-name()='resource' and namespace-uri()='']". / [ローカル名()='バンドル'かつ名前空間-uri()='']/ [ローカル名()='entry' および名前空間-uri()='']/ [local-name()='resource'とnamespace-uri()=''の組み合わせ。]

デバッチするものがないメッセージは単に "消える" を期待しますが、代わりにグループハブでエラーになります。このエラーを取り除く方法について、何かアイデアや提案があれば、非常に感謝します。

解決方法を教えてください。

以下のbody_xpathを使用すると、'entry'のレコードを持つ'Bundle'のみを抽出することができます。

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()='']"