簡體   English   中英

BizTalk 2013r2 - 架構中的空元素

[英]BizTalk 2013r2 - Null elements in schemas

嘗試配置模式,使其始終提供每個元素,無論它是否已填充。

我已經嘗試在架構中的所有元素上將 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:使用可空值 (xsi:nil=”true”) (Sandro 的 WordPress 博客)

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

我無法重現您遇到的問題。

我創建了一個帶有 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>

並獲得了日期字段仍然存在且為 Nill 的預期輸出。

<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. 空字段( <Date/><Date></Date> )與空字段( <Date xsi:nil="true" /> )之間存在差異。 如果您正在執行 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,那么您可以按照 Sandro 的示例進行操作,但您所要做的就是使用邏輯日期 Functoid 而不是 IsNill functoid,並相應地調整邏輯(因為它反轉了真/假) .

帶有缺失日期邏輯的地圖

那會產生

<ns0:Root xmlns:ns0="http://Scratch2.Schema.SO72560754" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <account_id>267336302</account_id> 
  <hus_id /> 
  <date_left xsi:nil="true" /> 
</ns0:Root>

如果您有該類型的字段,您還希望啟用nillable="true" ,您也可以使用邏輯字符串和邏輯數字 functoid。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM