nillable和minOccurs是XSD元素属性

36

我一直在使用minOccurs="0"nillable="true"设置元素,反复思考这两种方法。

我阅读了这篇文章,现在我不确定是否值得同时使用这两种方法。文章提供了一个很好的示例,表示数组时可能会有空值插入其中,而这无法通过仅使用minOccurs="0"实现。现在,我一直遵循的惯例是: 如果一个元素是必需的,那么它就不能为nillable

据我理解,nillable属性的作用在于表示可以传递XSD等效的NULL值,否则,没有nillable属性的元素必须在其所施加的限制内具有值。

1个回答

57

你需要决定你是将XML视为XML,还是将XML视为从这里传输Java(或其他)对象的一种方式。

在XML中,nillable允许构造<myelement xsi:nil='true'/>,作为显式缺失值的指示符,类似于SQL NULL。这在语义上与仅有<myelement/>是不同的。而且两者都与完全没有不同。因此,在处理XML时,您必须区分四种情况:

<!-- nothing -->
<myElement attr1='true'>some content</myElement>
<myElement/>
<myElement xsi:nil='true'/>

如果你主要关注Java——也许是因为你在使用SOAP,那么你需要考虑Java对象如何前后映射。

对于任何从Object继承的Java项目,JAXB和其他映射技术都需要一种处理null值的方法。Nillable 是这样做的方式。如果你禁止某些可以表示对象的nillable,工具包将会烦人地使用一个数组来代替。

另一方面,如果你有一个数组,请记住数组本身是一个对象,可以为null。因此,每个工具包都必须区分一个零元素数组和一个null。

另一方面,如果你有一个原始类型(例如int),nillable将会导致问题,因为没有从xsi:nil到基本类型的映射。


6
同时,任何元素的缺失也可能在语义上与 <myelement /> 和 xsi:nil=true 两者都不同。 - Zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接