我有一个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