2011-07-26 15 views
9

Estoy trabajando para obtener un archivo xml para validar contra un esquema XSD y estoy teniendo problemas con las validaciones. Cada vez que valido recibo errores que dicenXSD atributo NILLABLE no funciona

"Error de validez de los esquemas: Elemento '{http://services.website.com/ProgramResponse}Population': '' no es un valor válido del tipo atómico 'xs: double '. "

Creo que este error ocurre porque tengo un carácter nulo en ese campo, aparecen de este modo:
< HarvPop> </HarvPop>

Por lo tanto, para resolver este He intentado utilizar el nillable = "true" atributo para los elementos para que puedan ser nulos, pero aún aparecen como vacíos. Esta parece ser la única solución, pero no funciona en absoluto. Aún recibo los errores.

Actualmente estoy usando XMLMate para mis validaciones y lo he comprobado dos veces contra varios verificadores en línea también. El error aún persiste Cualquier sugerencia seria genial.

<?xml version="1.0" encoding="UTF-8"?> 

<xsd:element name="Reports" type="tns:ReportsType"/> 

<xsd:complexType name="ReportsType"> 
    <xsd:sequence> 
     <xsd:element name="Report" type="tns:ReportType" maxOccurs="unbounded" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="ReportType"> 
    <xsd:sequence> 
     <xsd:element name="Id" nillable="true"/> 
     <xsd:element name="Brand" type="xsd:string"/> 
     <xsd:element name="Address" type="xsd:string"/> 
     <xsd:element name="City" type="xsd:string"/> 
     <xsd:element name="State" type="xsd:string"/> 
     <xsd:element name="ZipCode" type="xsd:string"/> 
     <xsd:element name="Entry" type="tns:EntryType" maxOccurs="unbounded" minOccurs="1"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="EntryType"> 
    <xsd:sequence> 
     <xsd:element name="RM" nillable="true" type="xsd:double"/> 
     <xsd:element name="Pop" nillable="true" type="xsd:double"/> 
     <xsd:element name="Wt" nillable="true" type="xsd:double"/> 
     <xsd:element name="EntryId" type="xsd:int"/> 
    </xsd:sequence> 
</xsd:complexType> 

Respuesta

11

Un nodo como < HarvPop>< /HarvPop> está indicando que el valor está allí y que su valor es una cadena vacía.

Con base en la información de esta página w3.org: http://www.w3.org/TR/xmlschema-0/#Nils

El atributo nillable se utiliza como esto:

Definición: <xsd:element name="shipDate" type="xsd:date" nillable="true"/>

Uso: <shipDate xsi:nil="true"></shipDate>

es decir, Usted tiene que declarar específicamente que el valor es nulo.

La otra forma de hacerlo es declarar minoccurs = 0, para permitir que el valor falte.

+2

Alternativamente, cambiar el tipo de xs: doble a un tipo de lista cuyo tipoElemento es xs: doble, con minLength = 0 y maxLength = 1. De esta forma, puede omitir el valor sin el atributo redundante xsi: nil. –

+0

¿tiene que tener xsi: nil = "true" en el xml cuando se usa minOccurs también? – sublimeike

+1

No. nil significa que puede tener el nodo presente y vacío, minOccurs = 0 significa que puede faltar todo el nodo. –

Cuestiones relacionadas