解析xml null_XML模式中null的表示形式

解析xml null

Java bean具有属性或字段。 除非它们是原始类型,否则这些字段可以为null。 当您将Java bean映射到XML时,这些字段将成为元素或属性。 未经修饰的元素和属性不能具有空值(您可以将它们视为Java原语类型的等效物-都不能为空)。 装饰XML属性和元素的方法有很多种,以使它们的实例可以为null(或者至少在逻辑上等效于null)。

  • 对于属性:
    • 使用属性use="optional"
  • 对于元素:
    • 使用属性nillable="true"
    • 或使用属性minOccurs="0"

本技巧介绍了每个选择的详细信息和后果。

元素与属性

在研究null表示形式之前,首先要确定为什么要对对象字段使用元素而不是属性。 首先要考虑的是字段的类型。 您只能在属性中使用简单类型。 因此,如果您有复杂的类型,则别无选择。 您必须使用一个元素。 但是,如果您使用的是简单类型,则应使用哪个:属性或元素? 例如,给定清单1中的结构, attrFieldelemField是更好的结构?

清单1. AttributeOrElement模式
<complexType name="AttributeOrElement">
  <sequence>
    <element name="elemField" type="xsd:int"/>
  </sequence>
  <attribute name="attrField" type="xsd:int"/>
</complexType>

看一下清单2中的清单1中的模式实例。

清单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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值