2011-09-09 7 views
5

tengo unas pocas cosas en mi XSD:que tienen un XS vacías: elemento de fecha está validando bien por los XSD

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

Me gustaría que el pase de validación si hay una fecha o si hay un nodo vacío

<End_Date>2011-05-31T00:00:00.000</End_Date> debería estar bien, así como <End_Date></End_Date>

¿Cómo puedo modifiy el XSD para que así sea?

he intentado cosas diferentes:

nillable="true"

y

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

y

    <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> 

Ninguno de ellos trabajaron.

error:

Error detected : The 'xxxxxxxxxx: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.

Respuesta

6

Quizás esté confundido acerca de la diferencia entre xs: date y xs: dateTime. Has usado xs: date en tu esquema, pero tu ejemplo es xs: dateTime.

Hay tres maneras de lograr lo que quiere:

(a) definir un tipo que es una unión de (xs: dateTime y (restricción de xs: string permitiendo sólo ""))

(b) defina un tipo que sea una lista de xs: dateTime con minLength = 0, maxLength = 1

(c) defina que el elemento sea nulable. En este caso, la instancia tendrá que decir xsi: nil = "true", que en mi opinión hace que la instalación sea bastante inútil.

Si prueba uno de estos y no funciona, díganos exactamente lo que hizo y exactamente cómo falló.

+0

(a) hizo el trabajo, gracias – MoreCoffee

0

xsi: nill = true definitivamente debe ser válido, siempre y cuando se define el elemento de esquema como anulable. ¿Qué validador estás usando?

esquema:

<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> 

Instancia:

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

es válido.

+0

estoy usando .NET para la validación. ¿A qué te refieres por ejemplo? Tengo un XSD. Intenté agregar nillable = "true" en mi elemento xs: y recibí el mismo mensaje de error. – MoreCoffee

+0

Supongo que está tratando de validar un xml contra el xsd? La "instancia" en mi respuesta es el xml para validar.Entonces en el xsd usted define un tipo anulable llamado End_Date con el atributo nillable = verdadero. Luego, en el documento xml al crear el elemento End_Date, puede usar el atributo xsi: nil = "true". Como dije antes, esto definitivamente validará. –

+0

Todavía no ir: (En mi XML para validar pongo: '' En el XSD pongo: '' Obtengo el error: \t 'The 'http://cdcixis-cm.com/gbo: End_Date 'elemento no es válido - El valor' 'no es válido según su tipo de datos' http://www.w3.org/2001/XMLSchema:date '- La cadena' 'no es un valor XsdDateTime válido. – MoreCoffee

1
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. 
+0

El único problema que he encontrado con esta estrategia es que permite suministrar una lista de elementos como ... < EffectiveDt /> ... –

Cuestiones relacionadas