如何在XSD中声明可选的日期字段

时间:2015-11-17 20:58:30

标签: asp.net xml

我使用XSD来验证传入的XML元素。 XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.rg/2001/XMLSchema"
 xmlns:tns="http://xxxy/ervices/V0" 
targetNamespace="http://xxxy/ervices/V" elementFormDefault="qualified"
attributeFormDefault="unqualified" >

<xs:complexType name="FailType"> 
<xs:sequence>
<xs:element name="ConDt" type="xs:date" minOccurs="0" maxOccurs="1"     nillable="true"/>
  <xs:element name="PreEn" type="xs:string" minOccurs="1" maxOccurs="1"/>
 </xs:sequence>
 </xs:complexType>
 </xs:schema>

我的XML文件

<Pat xmlns="http://xxxy/ervices/V">
<ConDt></ConDt>
</Pat>

我得到的元素无效 - 根据数据类型“http://org/2001/XMLSchema:date”,值''无效 - 字符串''不是有效的日期值。

2 个答案:

答案 0 :(得分:0)

指定nillable =“true”允许您的实例包含

<ConDt xsi:nil="true"></ConDt>

但它不允许你写

<ConDt></ConDt>

(请不要问我他们在想什么......)

如果你想允许

<ConDt></ConDt>

然后有两种可能的方法

  1. 将其定义为允许xs:date或a的联合类型 零长度字符串,或

  2. (我的首选方法)将其定义为列表类型:xs:date值列表,其中maxLength =“1”。

答案 1 :(得分:0)

非常感谢迈克尔。我非常感谢你的帮助。

下面的代码将允许我们声明可选的日期字段。

   <xs:element name="ConDt" maxOccurs="unbounded" minOccurs="0">
    <xs:simpleType>
      <xs:union>
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="0" />
            <xs:maxLength value="0" />
          </xs:restriction>
        </xs:simpleType>
        <xs:simpleType>
          <xs:restriction base="xs:date" />
        </xs:simpleType>
      </xs:union>
    </xs:simpleType>
  </xs:element>