Empty elements for primitve datatypes forbidden in XSD

ぐ巨炮叔叔 提交于 2020-01-24 15:51:31

问题


I encountered a parsing error with Apache CXF while processing a webservice response. What it comes down to is an empty element being returned:

<myValue />

The element definition is as follows:

<xsd:element name="myValue" type="xsd:float" minOccurs="0">

Now I've read on the CXF mailing list that an empty value is not allowed by the XSD-spec:

Well, there isn't a workaround for this as it's not a bug. An empty element is not valid for any Decimal or Date type or anything like that.
Thus, it SHOULD throw an exception.
What are you expecting it to do?

Now here comes the question: Where exactly can I find this constraint in the XML Schema specification?


回答1:


Where exactly can I find this constraint in the XML Schema specification?

http://www.w3.org/TR/xmlschema-2/#float-lexical-representation

float values have a lexical representation consisting of a mantissa followed, optionally, by the character "E" or "e", followed by an exponent.
...
The representations for exponent and mantissa must follow the lexical rules for integer and decimal.
...
The special values positive and negative infinity and not-a-number have lexical representations INF, -INF and NaN, respectively.

So xs:float requires at least a mantissa that is a xs:decimal...

decimal has a lexical representation consisting of a finite-length sequence of decimal digits (#x30-#x39) separated by a period as a decimal indicator. An optional leading sign is allowed.

...and an empty string is not a valid xs:decimal.

If you don't have a value for this element, you should try not including this element, if possible. Your schema seems to allow omitting this element because minOccurs has value 0. Other solution would be to insert a suitable replacement value, like 0 or NaN.




回答2:


This is not a definitive constraint. You should be able to change your xsd to

<xsd:element name="myValue" type="xsd:float" minOccurs="0" default="0" />

And then be able to supply an empty element for your float without causing your xml to be invalid.

The above example means that if the element is empty, then its value is 0. Beware, default attribute does not apply on missing elements: missing elements are just missing, whether they have a declared default or not. http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

if the element appears without any content, the schema processor provides the element with a value equal to that of the default attribute. However, if the element does not appear in the instance document, the schema processor does not provide the element at all.

I have not used this till now, but to guard against a personal miss-reading of w3c specs, I have check with an online validator that an xml with an empty xs:float element having a default was accepted (at least by this online validator: http://www.freeformatter.com/xml-validator-xsd.html ).



来源:https://stackoverflow.com/questions/5043496/empty-elements-for-primitve-datatypes-forbidden-in-xsd

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!