XML Schema 中空值的表示(一)

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

  当您将空的 Java™ Bean 映射到 XML 时如何在对应的 XML 中表示空值。本文探究和比较进行这种表示的许多方式。

  Introduction

  Java Bean 有属性或字段。如果这些字段不是基元类型的,则它们可能是空的。当您将 Java Bean 映射到 XML 时,这些字段就变成了元素或属性。未经修饰的元素和属性不能具有空值(您大致可以把它们看作是对应的 Java 基元类型——二者都不能为空)。有许多修饰 XML 属性和元素的方法,采用这些方法可以使它们的实例为空(或者至少在逻辑上等同于空值)。

  对于属性:

  使用属性 use="optional"

  对于元素:

  使用属性 nillable="true"
  或使用属性 minOccurs="0"

  本文描述上面的每一种选择的细节和可能出现的情况。

  元素与属性

  在研究空表示之前,首先确定可能需要在对象字段中使用元素与属性的原因。需要考虑的第一件事是字段的类型。您只能在属性中使用简单的类型。因此,如果您使用的是复杂类型,则没有选择的余地;必须 使用元素。然而,如果您使用的是简单类型,那么您应该选择属性还是元素呢?例如,给定的清单 1 中的结构,哪一个更好?attrField 还是 elemField?

  清单 1. AttributeOrElement Schema

<complexType name="AttributeOrElement">
  <sequence>
    <element name="elemField" type="xsd:int"/>
  </sequence>
  <attribute name="attrField" type="xsd:int"/>
</complexType>

  让我们看一看清单 2,它是清单 1 中的 Schema 的实例。

  清单 2. AttributeOrElement 的实例

<attributeOrElement attrField="5">
  <elemField>5</elemField>
</attributeOrElement>

  显然,在该实例中,属性字段占用的空间比元素字段小,因此使用包含属性的 XML 的 SOAP 消息的传输时间会更短。看起来假定属性比元素更好似乎是合理的。但是如果您与 Schema 打过一段时间的交道,您可能很少看到使用属性。这是为什么呢?我实在无法告诉您具体的原因,不过我有一些想法:

  由于您必须 在复杂类型中使用元素,因此从一致性方面考虑,您也应该将元素用于简单类型。最后得到的是看起来更简单的 Schema。

  文档/文字包装的模式规定包装程序元素的 complexType 不包含属性。由于包装程序元素中的这一参数列表只能是元素,因此从一致性方面考虑,所有的 complexType 列表都应该是元素。

  由于属性没有顺序,而元素有顺序(除非使用 标记),因此解析属性的开销可能比解析元素高一些(不过,我怀疑这对于复杂的 XML 解析器真的不是一个问题)。

  所以为了简单起见,我建议坚持使用元素,除非吞吐量性能是需要关注的重要问题,在这种情况下,您可以测试属性是否能改进性能。

  现在让我们讨论空值。

  空属性

  正如我已经提到的,您可以通过让属性可选来使其逻辑上可为空值。请参见清单 3 中带有可为空值的属性的 Schema,以及清单 4 中的实例——一个字段中包含值的实例和一个字段中不包含值的实例。

  清单 3. TypeWithNullAttribute Schema

<complexType name="TypeWithNullAttribute">
  <attribute name="attrField" type="xsd:int" use="optional"/>
</complexType>

  清单 4. TypeWithNullAttribute 的实例

Attribute with a value:

<typeWithNullAttribute attrField="5"/>

Attribute passed as null:

<typeWithNullAttribute/> 

  可以看出,空属性的 Schema 声明相当简单。空属性的实例也非常简单——不过这里不进行具体说明。

 

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐