2011-07-26 31 views
9

我的工作得到一個XML文件來驗證對XSD架構和我遇到的麻煩驗證。每次我驗證我收到錯誤說XSD屬性的nillable不工作

「架構有效性錯誤:元素'{http://services.website.com/ProgramResponse}Population':''不是原子類型的有效值'xs:double 」「。

我認爲這個錯誤是因爲我在那場空字符,顯示如下:
< HarvPop> </HarvPop>

因此,要解決這個我用的nillable =「真」試屬性,因此它們可以爲空,但仍顯示爲空。這似乎是唯一的解決方案,但它根本無法工作。我仍然得到錯誤。

我目前使用我的驗證XMLMate和我有雙重檢查它agains幾個在線驗證者爲好。錯誤仍然存​​在。任何建議都會很棒。

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

回答

11

< HarvPop>< /HarvPop>一個節點,指出價值是存在的,它的值是一個空字符串。

在此基礎上w3.org頁面上的信息:即您 <shipDate xsi:nil="true"></shipDate>

http://www.w3.org/TR/xmlschema-0/#Nils

的的nillable屬性用於這樣的:

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

用法必須明確說明該值爲空。

其他方式做到這一點是陳述的minOccurs = 0,以允許丟失的值。

+2

或者,改變從XS類型:雙到列表類型,其ITEMTYPE是xs:雙,其中的minLength = 0和最大長度= 1。這樣,您可以省略該值,而不需要冗餘的xsi:nil屬性。 –

+0

你必須有XSI:無在XML =「真」使用的minOccurs的時候呢? – sublimeike

+1

號零意味着可以具有節點當前和空的,的minOccurs = 0意味着整個節點可以被缺失。 –