xml XSD 属性 NILLABLE 不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6831428/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 14:51:37  来源:igfitidea点击:

XSD attribute NILLABLE not working

xmlxsdxsd-validation

提问by sublimeike

I am working on getting an xml file to validate against an XSD schema and I'm having trouble with the validations. Every time I validate I get errors saying

我正在获取一个 xml 文件以针对 XSD 架构进行验证,但我在验证时遇到了问题。每次我验证我都会收到错误说

"Schemas validity error: Element '{http://services.website.com/ProgramResponse}Population': '' is not a valid value of the atomic type 'xs:double'."

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

I believe this error happens because I have a null character in that field, displayed like this:
< HarvPop>< /HarvPop>

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

So, to solve this I tried using the nillable="true" attribute for the elements so they will be able to be null, but still show up as empty. This seems to be the only solution, but it is not working at all. I still get the errors.

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

I am currently using XMLMate for my validations and I have double checked it agains several online verifiers as well. The error still persists. Any suggestions would be great.

我目前正在使用 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>

回答by Jon Egerton

A node like < HarvPop>< /HarvPop>is stating that the value is there and that it's value is an empty string.

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

Based on the information on this w3.org page: http://www.w3.org/TR/xmlschema-0/#Nils

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

The nillable attribute is used like this:

可以像这样使用 nillable 属性:

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

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

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

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

ie You have to specifically state that the value is null.

即您必须特别声明该值为空。

The other way to do it is to state minoccurs = 0, to allow the value to be missing.

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

回答by sublimeike

One way that I found that also fixes the problem with minimal code was to add the default="0" attribute to the XSD. This allows you to validate as a double without having to deal with nil by making nil default to a number.

我发现也可以用最少的代码解决问题的一种方法是将 default="0" 属性添加到 XSD。这允许您通过将 nil 默认为数字来验证双精度值而无需处理 nil。

Error deserialising XML document with strongly typed XSD

使用强类型 XSD 反序列化 XML 文档时出错