XSD中禁止primitve数据类型的空元素
我在处理webservice响应时遇到Apache CXF解析错误。归根结底,返回的是一个空元素:XSD中禁止primitve数据类型的空元素,xsd,cxf,xsd-validation,Xsd,Cxf,Xsd Validation,我在处理webservice响应时遇到Apache CXF解析错误。归根结底,返回的是一个空元素: <myValue /> 元素定义如下: <xsd:element name="myValue" type="xsd:float" minOccurs="0"> 现在我在CXF邮件列表上看到: 嗯,没有一个解决办法 这是因为它不是一个bug。空的 元素对任何小数点无效 或者日期类型之类的。 因此,它应该抛出一个异常。 你期望它做什么 现在问题来了:在XML模式规范
<myValue />
元素定义如下:
<xsd:element name="myValue" type="xsd:float" minOccurs="0">
现在我在CXF邮件列表上看到:
嗯,没有一个解决办法
这是因为它不是一个bug。空的
元素对任何小数点无效
或者日期类型之类的。因此,它应该抛出一个异常。
你期望它做什么 现在问题来了:在XML模式规范中,我到底在哪里可以找到这个约束 在XML模式规范中,在哪里可以找到这个约束 浮点值具有词汇意义 由一个 尾数后接尾数(可选) 字符“E”或“E”,后跟 指数。
…
指数和指数的表示 尾数必须遵循词汇规则 用于整数和小数。
…
特殊的价值观是积极的和积极的 负无穷大与非一个数 具有词汇表示形式INF,-INF 和南 所以
xs:float
至少需要一个尾数,即xs:decimal
decimal有一个词汇表示法
由有限长序列组成
小数位数(#x30-#x39)
以小数点形式由句点分隔
指标。一个可选的前导符号是
允许
…并且空字符串不是有效的xs:decimal
如果没有此元素的值,则应尽可能不包含此元素。您的架构似乎允许忽略此元素,因为
minOccurs
具有值0
。其他解决方案是插入合适的替换值,如0
或NaN
这不是一个确定的约束。
您应该能够将xsd更改为
<xsd:element name="myValue" type="xsd:float" minOccurs="0" default="0" />
然后能够为float提供一个空元素,而不会导致xml无效
上面的示例表示,如果元素为空,则其值为0。注意,默认属性不适用于缺少的元素:缺少的元素只是缺少,不管它们是否具有声明的默认值。
如果元素显示时没有任何内容,架构处理器将为元素提供一个与默认属性相同的值。但是,如果该元素没有出现在实例文档中,则模式处理器根本不提供该元素
到目前为止,我还没有使用过它,但为了防止个人误读w3c规范,我已经向在线验证器检查过,是否接受了带有空xs:float元素且具有默认值的xml(至少这个在线验证器:)