我在处理Web服务响应时遇到了Apache CXF的解析错误。它归结为一个空元素被返回:
<myValue />
元素定义如下:
<xsd:element name="myValue" type="xsd:float" minOccurs="0">
现在我在CXF邮件列表上看到empty value is not allowed by the XSD-spec:
嗯,没有解决方法 这不是一个错误。一个空的 element对任何Decimal都无效 或日期类型或类似的东西。
因此,它应该抛出一个例外 你有什么期望呢?
现在问题是:我在XML Schema规范中哪里可以找到这个约束?
答案 0 :(得分:2)
我在XML Schema规范中哪里可以找到这个约束?
http://www.w3.org/TR/xmlschema-2/#float-lexical-representation
浮点数值有词汇 表示由a组成 尾数跟随,可选地,由 字符“E”或“e”,后跟一个 指数。
...
指数和指数的表示 尾数必须遵循词汇规则 用于整数和小数 ...
特殊价值观积极和 负无穷大而不是数字 有词汇表示INF,-INF 和NaN,分别。
因此xs:float
至少需要一个xs:decimal
...
decimal有一个词法表示 由有限长度的序列组成 十进制数字(#x30-#x39) 以小数分隔的句点 指示符。可选的前导标志是 允许的。
...空字符串不是有效的xs:decimal
。
如果您没有此元素的值,则应尽量不要包含此元素。您的架构似乎允许省略此元素,因为minOccurs
具有值0
。其他解决方案是插入合适的替换值,例如0
或NaN
。
答案 1 :(得分:0)
这不是一个明确的约束。 您应该能够将xsd更改为
<xsd:element name="myValue" type="xsd:float" minOccurs="0" default="0" />
然后能够为浮动提供一个空元素,而不会导致xml无效。
上面的示例意味着如果元素为空,则其值为0.注意,默认属性不适用于缺少的元素:缺少元素只是缺失,是否具有声明的默认值。 http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints
如果元素没有任何内容,则架构处理器为元素提供的值等于默认属性的值。但是,如果元素未出现在实例文档中,则架构处理器根本不提供该元素。
到目前为止我还没有用过这个,但是为了防止个人错过了w3c规范,我已经在线验证器检查了一个带有默认的空xs:float元素的xml被接受了(至少是这个在线验证器:http://www.freeformatter.com/xml-validator-xsd.html)。