Java Bean 有屬性或字段。如果這些字段不是基元類型的,則它們可能是空的。當(dāng)您將 Java Bean 映射到 XML 時(shí),這些字段就變成了元素或?qū)傩浴N唇?jīng)修飾的元素和屬性不能具有空值(您大致可以把它們看作是對(duì)應(yīng)的 Java 基元類型——二者都不能為空)。有許多修飾 XML 屬性和元素的方法,采用這些方法可以使它們的實(shí)例為空(或者至少在邏輯上等同于空值)。
use="optional"
nillable="true"
minOccurs="0"
在研究空表示之前,首先確定可能需要在對(duì)象字段中使用元素與屬性的原因。需要考慮的第一件事是字段的類型。您只能在屬性中使用簡(jiǎn)單的類型。因此,如果您使用的是復(fù)雜類型,則沒有選擇的余地;必須 使用元素。然而,如果您使用的是簡(jiǎn)單類型,那么您應(yīng)該選擇屬性還是元素呢?例如,給定的清單 1 中的結(jié)構(gòu),哪一個(gè)更好?attrField
還是 elemField
?
<complexType name="AttributeOrElement"> <sequence> <element name="elemField" type="xsd:int"/> </sequence> <attribute name="attrField" type="xsd:int"/> </complexType> |
讓我們看一看清單 2,它是清單 1 中的 Schema 的實(shí)例。
<attributeOrElement attrField="5"> <elemField>5</elemField> </attributeOrElement> |
顯然,在該實(shí)例中,屬性字段占用的空間比元素字段小,因此使用包含屬性的 XML 的 SOAP 消息的傳輸時(shí)間會(huì)更短??雌饋砑俣▽傩员仍馗盟坪跏呛侠淼?。但是如果您與 Schema 打過一段時(shí)間的交道,您可能很少看到使用屬性。這是為什么呢?我實(shí)在無法告訴您具體的原因,不過我有一些想法:
<all>
標(biāo)記),因此解析屬性的開銷可能比解析元素高一些(不過,我懷疑這對(duì)于復(fù)雜的 XML 解析器真的不是一個(gè)問題)。 所以為了簡(jiǎn)單起見,我建議堅(jiān)持使用元素,除非吞吐量性能是需要關(guān)注的重要問題,在這種情況下,您可以測(cè)試屬性是否能改進(jìn)性能。
現(xiàn)在讓我們討論空值。
正如我已經(jīng)提到的,您可以通過讓屬性可選來使其邏輯上可為空值。請(qǐng)參見清單 3 中帶有可為空值的屬性的 Schema,以及清單 4 中的實(shí)例——一個(gè)字段中包含值的實(shí)例和一個(gè)字段中不包含值的實(shí)例。
<complexType name="TypeWithNullAttribute"> <attribute name="attrField" type="xsd:int" use="optional"/> </complexType> |
Attribute with a value: <typeWithNullAttribute attrField="5"/> Attribute passed as null: <typeWithNullAttribute/> |
可以看出,空屬性的 Schema 聲明相當(dāng)簡(jiǎn)單。空屬性的實(shí)例也非常簡(jiǎn)單——不過這里不進(jìn)行具體說明。
由于很少使用屬性,而更普遍地使用元素,因此我們轉(zhuǎn)到空元素。有兩種通過元素表示空值的方法:使用屬性 nillable="true"
或者使用屬性 minOccurs="0"
。Listing 5 展示了 TypeWithNullElements 的 Schema,它為每種可為空值的字段樣式提供一個(gè)元素。
<complexType name="TypeWithNullElements"> <sequence> <element name="nillableElem" nillable="true" type="int"/> <element name="minOccursElem" minOccurs="0" type="int"/> </sequence> </complexType> |
清單 6 展示了 TypeWithNullElements 的實(shí)例,首先出現(xiàn)的是常規(guī)值,接下來的是空值。
Elements with values: <typeWithNullElements> <nillableElem>5</nillableElem> <minOccursElem>5</minOccursElem> </typeWithNullElements> Elements with null values: <typeWithNullElements> <nillableElem xsi:nil="true"/> </typeWithNullElements> |
與可選的屬性一樣,具有 minOccurs="0"
屬性的元素的值為空,不過沒有出現(xiàn)在 XML 實(shí)例中。與使用屬性 nillable="true"
定義的元素相比,此元素在消息大小方面的代價(jià)肯定要低一些。即使 nillableElem
的值為空,但是它仍然有值占位符,指示其實(shí)際為空。
很顯然,minOccursElem
比 nillableElem
好一些,但是為什么始終需要使用 nillableElem
呢?我已經(jīng)提示過。前面我講到,nillableElem
的空值有值占位符。在哪里您可能需要占位符?這樣的一個(gè)例子就是數(shù)組,其中的每個(gè)數(shù)組條目都可能為空。例如,設(shè)想一個(gè)數(shù)組有四個(gè)元素,其值為 {0, null, 1, null}。您如何使用 minOccursElem
元素的實(shí)例表示該數(shù)組呢?回答是:您不能這樣做。無法區(qū)分上述四個(gè)元素組成的數(shù)組和其值為 {0, 1} 的兩個(gè)元素組成的數(shù)組。如果使用 minOccurs="0"
元素,則沒有空元素占位符。因此在這種情況下,您必須使用 nillable="true"
元素。清單 7 展示了這樣的一個(gè)數(shù)組的 Schema,清單 8展示了 {0, null, 1, null} 的 XML 實(shí)例。
(要更深入地了解數(shù)組和空值,請(qǐng)參閱參考資料中的文章“Array Gotcha”。)
<complexType name="nullableElementArray"> <sequence> <element name="elem" type="int" maxOccurs="4" nillable="true"/> </sequence> </complexType> |
<nullableElementArray> <elem>1</elem> <elem xsi:nil="true"/> <elem>2</elem> <elem xsi:nil="true"/> </nullableElement> |
有三種在 XML Schema 中表示空字段的方法:可選的屬性、minOccurs="0"
元素和 nillable="true"
元素。使用上面各個(gè)元素的情況如下:如果是可為空值的簡(jiǎn)單類型,則使用可選的屬性;如果是可為空值的復(fù)雜類型,并且希望它占用最小的空間,則使用 minOccurs="0"
元素;如果空值必須有占位符(例如當(dāng)其在數(shù)組中出現(xiàn)時(shí)),則使用 nillable="true"
元素。
聯(lián)系客服