解析xml null
Java bean具有属性或字段。 除非它们是原始类型,否则这些字段可以为null。 当您将Java bean映射到XML时,这些字段将成为元素或属性。 未经修饰的元素和属性不能具有空值(您可以将它们视为Java原语类型的等效物-都不能为空)。 装饰XML属性和元素的方法有很多种,以使它们的实例可以为null(或者至少在逻辑上等效于null)。
- 对于属性:
- 使用属性
use="optional"
- 使用属性
- 对于元素:
- 使用属性
nillable="true"
- 或使用属性
minOccurs="0"
- 使用属性
本技巧介绍了每个选择的详细信息和后果。
元素与属性
在研究null表示形式之前,首先要确定为什么要对对象字段使用元素而不是属性。 首先要考虑的是字段的类型。 您只能在属性中使用简单类型。 因此,如果您有复杂的类型,则别无选择。 您必须使用一个元素。 但是,如果您使用的是简单类型,则应使用哪个:属性或元素? 例如,给定清单1中的结构, attrField
或elemField
是更好的结构?
清单1. AttributeOrElement模式
<complexType name="AttributeOrElement">
<sequence>
<element name="elemField" type="xsd:int"/>
</sequence>
<attribute name="attrField" type="xsd:int"/>
</complexType>
清单2. AttributeOrElement的实例
<attributeOrElement attrField="5">
<elemField>5</elemField>
</attributeOrElement>
显然,属性字段在实例中所占的空间比元素字段所占的空间少,因此具有XML且包含属性的SOAP消息将更小,因此,所需的传输时间也更少。 因此,假设属性比元素更好似乎是合理的。 但是,如果您处理模式已有一段时间,那么您可能已经注意到,您并不经常看到使用的属性。 这是为什么? 尽管我有一些想法,但实际上我无法告诉您:
- 由于必须将元素用于复杂类型,因此为了保持一致性,还应该将元素也用于简单类型。 您最终得到了更简单的架构。
- 文档/文字包装的模式规定包装元素的复杂类型不包含属性(请参阅“我应该采用哪一种WSDL样式?”一文中相关信息 )。 由于包装器元素中的此参数列表只能是元素,因此,为了保持一致,所有complexType列表都应该是元素。
- 由于没有属性排序,并且元素也排序(除非使用
<all>
标记),因此,解析属性的成本可能比解析元素的成本更高。 (但是,我怀疑复杂的XML解析器并不是真正的问题。)
因此,为简单起见,除非您不关心吞吐量性能,否则我建议坚持使用元素,此时您可以测试属性是否可以提高性能。
现在让我们讨论空值。
空属性
正如我已经提到的,您可以通过将属性设为可选来使属性在逻辑上为空。 请参阅清单3中的具有可空属性的模式, 清单4中的实例-一种在字段中具有值,另一种没有字段。
清单3. TypeWithNullAttribute模式
<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/>
您可以看到null属性的模式声明非常简单。 null属性的实例也非常简单-根本不存在。
空元素
由于很少使用属性,并且元素更为普遍,因此让我们继续介绍null元素。 有两种用元素表示空值的方法:使用属性nillable="true"
或使用minOccurs="0"
。 清单5显示了TypeWithNullElements的模式,其中每种可空字段样式都包含一个元素。
清单5. TypeWithNullElements的模式
<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"
属性(其值为null)的元素根本不会出现在XML实例中。 就消息大小而言,这显然比使用属性nillable="true"
定义的元素要少。 nillableElem
,即使其值为null,其值仍具有一个占位符,表明它确实为null。
当nillable="true"
有用时
minOccursElem
显然比nillableElem
更好,为什么还要使用nillableElem
? 我已经给你了提示。 我说过nillableElem
的空值有一个占位符 。 您可能在哪里需要占位符? 一个示例是一个数组,其中每个数组项都可能为空。 想象一下一个包含四个元素的数组,例如,它们的值为{0,null,1,null}。 您如何使用minOccursElem
元素的实例表示该数组? 答:你不能。 无法区分上述四个元素数组和两个元素数组,其值分别为{0,1}。 对于minOccurs="0"
元素,null元素没有占位符。 因此,在这种情况下,您必须使用nillable="true"
元素。 清单7显示了这种数组的模式, 清单8显示了{0,null,1,null}的XML实例。
(有关数组和空值的微妙扭曲,请参阅“阵列疑难杂症”的文章相关主题 。)
清单7.可数组元素的模式
<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模式中,有三种表示空字段的方式:可选属性, minOccurs="0"
元素和nillable="true"
元素。 在某些情况下,您可能会使用以下每种情况:可选属性(如果您具有简单的可为null的类型); 一个minOccurs="0"
元素,如果您有一个复杂的可为空的类型,并且希望它占用最少的空间; 如果空值必须具有占位符(例如,当它出现在数组中时),则为nillable="true"
元素。
翻译自: https://www.ibm.com/developerworks/xml/library/ws-tip-null/index.html
解析xml null