【问题标题】:BizTalk 2013r2 - Null elements in schemasBizTalk 2013r2 - 架构中的空元素
【发布时间】:2022-07-05 10:56:07
【问题描述】:

尝试配置架构,使其始终提供每个元素,无论它是否已填充。

我已经尝试在架构中的所有元素上将 minOccurs 设置为 1 并将 nillable 设置为 true,但它仍然没有任何区别。我通过传递架构中的日期元素为空的消息进行了测试,但它仍然从收到的消息中删除了该元素。

通过 WCF-SQL 类型轮询端口获取有效负载,然后将创建的消息直接发送到消息框以供下游提取(该过程创建一个规范的有效负载,可被多个其他下游集成接受)。

架构示例;

<xs:element minOccurs="1" name="account_id" nillable="true" type="xs:string" /> 
<xs:element minOccurs="1" name="hus_id" nillable="true" type="xs:string" /> 
<xs:element minOccurs="1" name="date_left" nillable="true" type="xs:date" />

WCF-SQL(类型化轮询)源数据示例;

account_id - '267336302'
hus_id - ''
date_left - NULL

收到的消息示例;

<account_id>267336302</account_id>
<hus_id/>

我查看了它背后的理论,在这篇链接文章的前两段中,暗示这些设置应该有所作为。

BizTalk Mapper: Working With Nillable Values (xsi:nil=”true”)(Sandro 的 WordPress 博客)

任何人都可以建议我如何根据需要接收包含所有元素的消息(是否为空值)。

【问题讨论】:

  • 您能否提供一个示例架构和有效负载,以及您是如何接收它的?例如你的管道是什么?如果有地图?

标签: biztalk biztalk-2013r2


【解决方案1】:

我无法重现您遇到的问题。

我创建了一个简单的模式,其中 on 元素是一个可空日期。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch2.Schema.SO72560754" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Scratch2.Schema.SO72560754" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="NillableDate" nillable="true" type="xs:date" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我创建了第二个相同的模式,只是我将提交的文件命名为简单的日期。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch2.Schema.SO72560754_out" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Scratch2.Schema.SO72560754_out" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Date" nillable="true" type="xs:date" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

并将两者映射在一起并将其部署到 BizTalk。

我通过 BizTalk 使用 XMLReceive Pipeline 和接收端口上的入站映射上的映射传递了以下消息。

<ns1:Root xmlns:ns1="http://Scratch2.Schema.SO72560754" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NillableDate xsi:nil="true" />
</ns1:Root>

并且得到了预期的输出,日期字段仍然存在并且为空。

<ns0:Root xmlns:ns0="http://Scratch2.Schema.SO72560754_out" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Date xsi:nil="true" />
</ns0:Root>

注意

  1. 空字段(&lt;Date/&gt;&lt;Date&gt;&lt;/Date&gt;)与空字段(&lt;Date xsi:nil="true" /&gt;)之间存在差异。如果您正在执行 XML 验证,则空日期将失败。
  2. 如果没有指定,MinOccurs = 1 是默认值。
  3. 如果源元素和目标元素都是强制性的(例如,必须在那里),那么您不需要做任何花哨的事情,只需像映射任何其他字段一样映射它们,并且不需要 functoid。只有当源是可选的而目标是强制性的时,您才需要做一些奇特的变通方法。

SQL

是的,使用 SQL 绑定,如果该字段为 NULL,那么它将省略该字段。一个快速而肮脏的修复方法就是在地图中添加一些连接 functoid,如下所示,并将其连接到一个空字符串。这将生成如下所示的 XML 有效负载。注意:如果您尝试根据架构对其进行验证,这将失败,因为空字符串不是有效日期,但默认情况下,BizTalk 不会验证,除非您告诉它。

<ns0:Root xmlns:ns0="http://Scratch2.Schema.SO72560754">
    <account_id>267336302 </account_id>
    <hus_id/>
    <date_left/>
</ns0:Root>

【讨论】:

  • 谢谢,我已经用源数据、架构和输出的示例编辑了我的原始帖子。那么基于上述情况,XML Validation 是否可以将 date_left 解释为空字符串,并将其完全删除?
  • 将问题进一步缩小到与源有关的问题。它来自日期字段为空的类型化轮询 WCF-SQL 存储过程。对此设置了 Min Occurs 和 nillable,这可能是问题的一部分吗?
  • @mrc85 为 SQL 适配器更新了它
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多