【问题标题】:Having an empty xs:date element being validated OK by the XSD有一个空的 xs:date 元素被 XSD 验证 OK
【发布时间】:2018-03-24 00:02:34
【问题描述】:

我的 XSD 中有这个:

<xs:element name="End_Date" type="xs:date" minOccurs="0"/>

如果有日期或有空节点,我想要验证通过

&lt;End_Date&gt;2011-05-31T00:00:00.000&lt;/End_Date&gt; 应该没问题 &lt;End_Date&gt;&lt;/End_Date&gt;

如何修改 XSD 以使其如此?

我尝试了不同的方法:

nillable="true"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"

                    <xs:element name="End_Date">
                    <xs:simpleType>
                        <xs:union memberTypes="xs:date">
                        <xs:simpleType>
                        <xs:restriction base="xs:string">
                        <xs:enumeration value=""/>
                        </xs:restriction>
                        </xs:simpleType>
                        </xs:union>
                    </xs:simpleType>
                </xs:element>

它们都不起作用。

错误:

检测到错误:“xxxxxxxxxx:End_Date”元素无效 - 值 '' 根据其数据类型无效 'http://www.w3.org/2001/XMLSchema:date' - 字符串 '' 无效 XsdDateTime 值。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    也许您对 xs:date 和 xs:dateTime 之间的区别感到困惑。您在架构中使用了 xs:date,但您的示例是 xs:dateTime。

    有三种方法可以实现你想要的:

    (a) 定义一个类型,它是 (xs:dateTime 和 (xs:string 的限制只允许 "")) 的并集

    (b) 定义一个类型,它是 xs:dateTime 的列表,其中 minLength = 0,maxLength = 1

    (c) 将元素定义为可空元素。在这种情况下,实例将不得不说 xsi:nil="true",在我看来,这让该设施变得毫无用处。

    如果您尝试其中一种方法但它不起作用,请准确告诉我们您做了什么以及它是如何失败的。

    【讨论】:

      【解决方案2】:
      Set Type="xs:date", derivedBy="list" and minOccurs="0"
      
      which looks like this in your XML Schem Document 
      
      <xs:element name="EffectiveDt" nillable="true" minOccurs="0">
        <xs:simpleType>
         <xs:list itemType="xs:date"/>
        </xs:simpleType>
      </xs:element>
      
      This will surely help you, I tried in my Code Works perfect.
      

      Validate Your XML against XSD here

      I am using this online XML validation against XSD tool.
      

      【讨论】:

      • 我发现这个策略的唯一问题是你允许提供一个元素列表,比如......
      • @MartinSjöblom 不,此架构不允许元素列表,它只允许单个元素中的日期列表。
      【解决方案3】:

      xsi:nill=true 只要您将架构元素定义为可空,就应该绝对有效。你用的是什么验证器?

      架构:

      <xs:schema xmlns="http://myNS" targetNamespace="http://myNS" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Root">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="End_Date" nillable="true" type="xs:dateTime" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:schema>
      

      实例:

      <ns0:Root xmlns:ns0="myNS">
        <End_Date xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
      </ns0:Root>
      

      有效。

      【讨论】:

      • 我正在使用 .NET 进行验证。你说的实例是什么意思?我有一个 XSD。我尝试在我的 xs:element 中添加 nillable="true" 并收到相同的错误消息。
      • 我假设您正在尝试针对 xsd 验证 xml?我的答案中的“实例”是要验证的 xml。因此,在 xsd 中,您定义了一个名为 End_Date 的 nillable 类型,其 nillable 属性 = true。然后在 xml 文档中,当您创作 End_Date 元素时,您可以使用 xsi:nil="true" 属性。正如我之前所说,这肯定会验证。
      • 仍然不行 :( 在我的 XML 中验证我输入:&lt;End_Date xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"&gt;&lt;/End_Date&gt; 在 XSD 我输入:&lt;xs:element name="End_Date" type="xs:date" nillable="true" /&gt; 我得到错误:The 'http://cdcixis-cm.com/gbo:End_Date' element is invalid - The value '' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:date' - The string '' is not a valid XsdDateTime value.
      • 您确定这是 xsd 模式树中唯一的 End_Date 类型吗?
      • 不用担心。仍然无法理解为什么您无法对其进行验证。
      【解决方案4】:

      这对我有用:

      [在 xsd 中:]

      <xs:simpleType name="DateOrEmptyDate">
          <xs:union memberTypes="xs:date">
              <xs:simpleType>
                  <xs:restriction base="xs:string">
                      <xs:enumeration value=""/>
                  </xs:restriction>
              </xs:simpleType>
          </xs:union>
      </xs:simpleType>    
      

      [有效 xml :]

      <EndDate/>
      <EndDate>2017-12-31</EndDate>
      

      [无效的 xml:]

      &lt;EndDate&gt;2017-31-31&lt;/EndDate&gt;

      【讨论】:

      • 如果您解释您的方法与 OP 的方法有何不同以及您的方法为何有效,我认为这将有助于显示更多的理解并避免来回提问。
      • 嗯。上帝保佑工作示例 ;-) 但似乎“xsd:union”可用于自定义不满意的 xsd 规则
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多