2009-12-14 85 views
34

我将前后设置元素设置为minOccurs="0"nillable="true"nillable和minOccurs XSD元素属性

我在阅读this文章,现在在我的WSDL中我不确定是否使用两者都是值得的。这篇文章给出了一个很好的例子,表示阵列中可能散布有空值的数组,因为这只能用minOccurs="0"来完成。现在,我一直在讨论的惯例是,如果一个元素不是可选的,那么它是不可空的。 根据我的理解和我的问题所在,区别在于,通过将nillable属性应用于某个元素,我说您可以传递与NULL值等价的XSD?否则,一个没有nillable属性的元素必须有一个值限制在它的范围内?

回答

55

您需要决定是否将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和其他映射技术都需要一种处理空值的方法。 Nillable是做到这一点的方法。如果你禁止对可能是对象的东西进行nillable,那么工具包会令人讨厌地使用数组来找出表示不存在的方式。另一方面,如果您有一个数组,请记住,数组本身是一个对象,并且可以为null。所以,每个工具包都必须区分零元素数组和null。另一方面,如果你有一个原始类型(例如int),nillable会导致问题,因为没有从xsi:nil到原语的映射。

+6

另外,任何元素的缺失也可能在语义上不同于和xsi:nil = true。 – Zach 2009-12-14 20:07:06