XSD属性NILLABLE无法正常工作

时间:2011-07-26 14:15:58

标签: xml xsd xsd-validation

我正在努力获取xml文件以针对XSD架构进行验证,并且我在验证时遇到问题。每次我验证我都会收到错误

“架构有效性错误:元素'{http://services.website.com/ProgramResponse}Population':''不是原子类型'xs:double'的有效值。”

我相信发生此错误是因为我在该字段中有一个空字符,显示如下:
    < HarvPop>< / HarvPop>

所以,为了解决这个问题,我尝试对元素使用nillable =“true”属性,这样它们就可以为null,但仍然显示为空。这似乎是唯一的解决方案,但它根本不起作用。我仍然得到错误。

我目前正在使用XMLMate进行验证,我再次对其进行了多次在线验证。错误仍然存​​在。任何建议都会很棒。

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

2 个答案:

答案 0 :(得分:11)

< HarvPop>< /HarvPop>这样的节点声明该值在那里并且它的值是一个空字符串。

根据此w3.org页面上的信息:http://www.w3.org/TR/xmlschema-0/#Nils

nillable属性的用法如下:

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

使用方法: <shipDate xsi:nil="true"></shipDate>

即您必须明确声明该值为空。

另一种方法是声明minoccurs = 0,以允许值丢失。

答案 1 :(得分:4)

我发现的另一种方法是用最少的代码修复问题是将默认值=“0”属性添加到XSD。这允许您通过将nil默认为数字来验证为double而不必处理nil。

Error deserialising XML document with strongly typed XSD