2011-07-26 12 views
9

Pracuję nad uzyskaniem pliku xml do sprawdzenia poprawności względem schematu XSD i mam problem z walidacjami. Za każdym razem, gdy sprawdzam poprawność, otrzymuję komunikat o błędzie: "Błąd ważności schematu: Element" {http://services.website.com/ProgramResponse}population ":" 'nie jest poprawną wartością typu atomowego "xs: double" "."Atrybut XSD NILLABLE nie działa

Uważam ten błąd ma miejsce, bo mam znak null w tej dziedzinie, wyświetlane tak:
< HarvPop> </HarvPop>

Tak więc, aby rozwiązać ten Próbowałem przy użyciu nillable = „true” atrybut dla elementów, dzięki czemu będą miały wartość NULL, ale nadal będą wyświetlane jako puste. To wydaje się być jedynym rozwiązaniem, ale w ogóle nie działa. Nadal dostaję błędy.

Obecnie używam XMLMate do moich sprawdzania poprawności i dwukrotnie sprawdziłem go również przed kilkoma weryfikatorami online. Błąd nadal występuje. Wszelkie sugestie byłyby świetne.

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

Odpowiedz

11

Węzeł jak < HarvPop>< /HarvPop> jest stwierdzając, że wartość jest tam i że to jest wartość nie jest pusty.

Na podstawie informacji zawartych na tej stronie w3.org: http://www.w3.org/TR/xmlschema-0/#Nils

Atrybut nillable jest używany tak:

Definicja: <xsd:element name="shipDate" type="xsd:date" nillable="true"/>

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

tj You muszą wyraźnie stwierdzić, że wartość jest zerowa.

Innym sposobem wykonania tej czynności jest określenie minoccurs = 0, aby umożliwić brak wartości.

+2

Alternatywnie zmienić typ z xs: double do typu lista, który ItemType jest xs: podwójne, z MINLENGTH = 0 MAXLENGTH = 1. W ten sposób możesz pominąć wartość bez zbędnego atrybutu xsi: nil. –

+0

Czy musisz mieć xsi: nil = "true" w xml również przy użyciu minOccurs? – sublimeike

+1

Nr zero oznacza, że ​​węzeł może być obecny i pusty, minOccurs = 0 oznacza, że ​​brakuje całego węzła. –

3

Jednym ze sposobów, które znalazłem, który rozwiązuje problem z minimalnym kodem, było dodanie domyślnego atrybutu = "0" do XSD. Pozwala to na walidację jako podwójne, bez konieczności radzenia sobie z zerą przez ustawienie zerowej wartości domyślnej na liczbę.

Error deserialising XML document with strongly typed XSD

Powiązane problemy