2009-12-14 139 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