XML Schema 中空值的表示(二)

日期: 2007-12-22 作者:Russell Butek 来源:TechTarget中国

  空元素

  由于很少使用属性,而更普遍地使用元素,因此我们转到空元素。有两种通过元素表示空值的方法:使用属性 nillable="true" 或者使用属性 minOccurs="0"。Listing 5 展示了 TypeWithNullElements 的 Schema,它为每种可为空值的字段样式提供一个元素。

  清单 5. TypeWithNullElements 的 Schema

<complexType name="TypeWithNullElements">
  <sequence>
    <element name="nillableElem" nillable="true" type="int"/>
    <element name="minOccursElem" minOccurs="0" type="int"/>
  </sequence>
</complexType> 

  清单 6 展示了 TypeWithNullElements 的实例,首先出现的是常规值,接下来的是空值。

  清单 6. TypeWithNullElements 的实例

Elements with values:

<typeWithNullElements>
  <nillableElem>5</nillableElem>
  <minOccursElem>5</minOccursElem>
</typeWithNullElements>

Elements with null values:

<typeWithNullElements>
  <nillableElem xsi_nil="true"/>
</typeWithNullElements> 

  与可选的属性一样,具有 minOccurs="0" 属性的元素的值为空,不过没有出现在 XML 实例中。与使用属性 nillable="true" 定义的元素相比,此元素在消息大小方面的代价肯定要低一些。即使 nillableElem 的值为空,但是它仍然有值占位符,指示其实际为空。

  nillable="true" 何时有用

  很显然,minOccursElem 比 nillableElem 好一些,但是为什么始终需要使用 nillableElem 呢?我已经提示过。前面我讲到,nillableElem 的空值有值占位符。在哪里您可能需要占位符?这样的一个例子就是数组,其中的每个数组条目都可能为空。例如,设想一个数组有四个元素,其值为 {0, null, 1, null}。您如何使用 minOccursElem 元素的实例表示该数组呢?回答是:您不能这样做。无法区分上述四个元素组成的数组和其值为 {0, 1} 的两个元素组成的数组。如果使用 minOccurs="0" 元素,则没有空元素占位符。因此在这种情况下,您必须使用 nillable="true" 元素。清单 7 展示了这样的一个数组的 Schema,清单 8 展示了 {0, null, 1, null} 的 XML 实例。

  清单 7. 可为空值的数组元素的 Schema

<complexType name="nullableElementArray">
  <sequence>
    <element name="elem" type="int" maxOccurs="4" nillable="true"/>
  </sequence>
</complexType> 

  清单 8. 可为空值的数组元素的 XML 实例

<nullableElementArray>
  <elem>1</elem>
  <elem xsi_nil="true"/>
  <elem>2</elem>
  <elem xsi_nil="true"/>
</nullableElement>

  总结

  有三种在 XML Schema 中表示空字段的方法:可选的属性、minOccurs="0" 元素和 nillable="true" 元素。使用上面各个元素的情况如下:如果是可为空值的简单类型,则使用可选的属性;如果是可为空值的复杂类型,并且希望它占用最小的空间,则使用 minOccurs="0" 元素;如果空值必须有占位符(例如当其在数组中出现时),则使用 nillable="true" 元素。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐