当您将空的 Java Bean 映射到 XML 时如何在对应的 XML 中表示空值。本文探究和比较进行这种表示的许多方式。
Introduction
Java Bean 有属性或字段。如果这些字段不是基元类型的,则它们可能是空的。当您将 Java Bean 映射到 XML 时,这些字段就变成了元素或属性。未经修饰的元素和属性不能具有空值(您大致可以把它们看作是对应的 Java 基元类型——二者都不能为空)。有许多修饰 XML 属性和元素的方法,采用这些方法可以使它们的实例为空(或者至少在逻辑上等同于空值)。
对于属性:
使用属性 use=”optional”
对于元素:
使用属性 nillable=”true”
或使用属性 minOccurs=”0″
本文描述上面的每一种选择的细节和可能出现的情况。
元素与属性
在研究空表示之前,首先确定可能需要在对象字段中使用元素与属性的原因。需要考虑的第一件事是字段的类型。您只能在属性中使用简单的类型。因此,如果您使用的是复杂类型,则没有选择的余地;必须 使用元素。然而,如果您使用的是简单类型,那么您应该选择属性还是元素呢?例如,给定的清单 1 中的结构,哪一个更好?attrField 还是 elemField?
清单 1. AttributeOrElement Schema
让我们看一看清单 2,它是清单 1 中的 Schema 的实例。
清单 2. AttributeOrElement 的实例
显然,在该实例中,属性字段占用的空间比元素字段小,因此使用包含属性的 XML 的 SOAP 消息的传输时间会更短。看起来假定属性比元素更好似乎是合理的。但是如果您与 Schema 打过一段时间的交道,您可能很少看到使用属性。这是为什么呢?我实在无法告诉您具体的原因,不过我有一些想法:
由于您必须 在复杂类型中使用元素,因此从一致性方面考虑,您也应该将元素用于简单类型。最后得到的是看起来更简单的 Schema。
文档/文字包装的模式规定包装程序元素的 complexType 不包含属性(请参阅参考资料中的文章“Which style of WSDL should I use?”)。由于包装程序元素中的这一参数列表只能是元素,因此从一致性方面考虑,所有的 complexType 列表都应该是元素。
由于属性没有顺序,而元素有顺序(除非使用
所以为了简单起见,我建议坚持使用元素,除非吞吐量性能是需要关注的重要问题,在这种情况下,您可以测试属性是否能改进性能。
现在让我们讨论空值。
空属性
正如我已经提到的,您可以通过让属性可选来使其逻辑上可为空值。请参见清单 3 中带有可为空值的属性的 Schema,以及清单 4 中的实例——一个字段中包含值的实例和一个字段中不包含值的实例。
清单 3. TypeWithNullAttribute Schema
清单 4. TypeWithNullAttribute 的实例
Attribute with a value:
Attribute passed as null:
可以看出,空属性的 Schema 声明相当简单。空属性的实例也非常简单——不过这里不进行具体说明。
空元素
由于很少使用属性,而更普遍地使用元素,因此我们转到空元素。有两种通过元素表示空值的方法:使用属性 nillable=”true” 或者使用属性 minOccurs=”0″。Listing 5 展示了 TypeWithNullElements 的 Schema,它为每种可为空值的字段样式提供一个元素。
清单 5. TypeWithNullElements 的 Schema
清单 6 展示了 TypeWithNullElements 的实例,首先出现的是常规值,接下来的是空值。
清单 6. TypeWithNullElements 的实例
Elements with values:
Elements with null values:
与可选的属性一样,具有 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
清单 8. 可为空值的数组元素的 XML 实例
总结
有三种在 XML Schema 中表示空字段的方法:可选的属性、minOccurs=”0″ 元素和 nillable=”true” 元素。使用上面各个元素的情况如下:如果是可为空值的简单类型,则使用可选的属性;如果是可为空值的复杂类型,并且希望它占用最小的空间,则使用 minOccurs=”0″ 元素;如果空值必须有占位符(例如当其在数组中出现时),则使用 nillable=”true” 元素。
关于作者
Russell Butek 是 IBM WebSphere Web 服务引擎的开发人员之一。他也是 JAX-RPC Java Specification Request(JSR)专家组的 IBM 代表。他从事 Apache 的 AXIS SOAP 引擎的实现方面的研究,推动了 AXIS 1.0 遵循 JAX-RPC 1.0。以前,他是 IBM CORBA ORB 的开发人员和许多 OMG 特别工作组的 IBM 代表:包括可移植拦截器特别工作组(他是这个特别工作组的主席)、核心特别工作组以及互操作性特别工作组。您可以通过 butek@us.ibm.com 与 Russell 联系。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
内存数据网格提供商一头扎进Java
10年的时间里,应用性能解决方案提供商Alachisoft一直在用NCache(针对N-Tier和网格计算.NET应用的内存计算和数据网格产品)为.NET社区服务。
-
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高, 直到把内存吃完应用崩溃,但是这个wrapper
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高 […]
-
Google App Engine for Java 对于目前中国需要学习吗?
-
前无古人后无来者的Java平台
开发人员一直在致力于保持Java的活力,经过20年后,我们感觉从来没有更好的、更令人激动的时刻如同Java社区一样。