我有一個XML架構:JAXB minOccurs = 0。元素是否存在?
<xsd:element name="Person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="lat" type="xsd:double" minOccurs="0"/>
<xsd:element name="lon" type="xsd:double" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
而且我有一個XML消息:
<Person>
<name>Fred</name>
</Person>
我使用JAXB自動生成我的課(即Person.java等)。
所以在運行時我使用JAXB解組以上的XML消息,並得到一個Person對象實例。當我做一個p.getLat()
或p.getLon()
的返回值都是0.0,即使原始的XML不包含<lat>
或<lon>
元素。
是什麼讓這個糟糕的是,0.0,0.0是一個有效的經度和緯度。一個人很少會在那裏找到,但那不是重點!
在IBM站點中的article使用附加的XML元素作爲元數據來明確陳述可選元素是否存在建議。即
<xsd:element name="hasLat" type="xsd:boolean"/>
<xsd:element name="hasLon" type="xsd:boolean"/>
所以上面的XML消息將成爲:
<Person>
<name>Fred</name>
<hasLat>false</hasLat>
<hasLon>false</hasLon>
</Person>
這似乎是一個醜陋的黑客。 JAXB必須有一個合適的方法來檢查元素是否存在,以便我可以信任來自我的getLat()
,getLon()
的返回值?
您是使用Java 6中的JAXB還是使用1.5的獨立庫? JAXB如何生成類的方式發生了變化。特別是對於數組。嘗試最新的一個。 – 2009-11-27 02:31:00
我使用JAXME(在Fedora上的軟件包是ws-jaxme-0.5.1-3.4.fc11.noarch)和Java 6(java-1.6.0-openjdk-1.6.0.0-30.b16.fc11.i586) 。 – 2009-11-27 21:26:40
這似乎是JAXB 2.0的JAXME實現的一個特別問題。切換到Sun的實現時,如果元素未包含在XML消息中,getter將返回空值。 – 2009-11-30 20:45:38