JAXB minOccurs = 0。元素存在与否?

时间:2009-11-26 23:22:54

标签: java xml jaxb

我有一个XML架构:

<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()时,即使原始XML不包含<lat><lon>元素,返回值也为0.0。

更糟糕的是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()的返回值?

2 个答案:

答案 0 :(得分:4)

我根本没有看到这个问题。对我来说,xjc会生成Person类,其中属性latlon类型为Double

如果我解组一个没有<lat><lon>元素的XML文件,那么生成的Person个对象对这些属性的值为null,正如我所期望的那样。

我不知道你如何在任何地方获得0.0

我的XML架构:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.com/person">
 <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>
</xsd:schema>

我的Test.java

import com.example.person.Person;
import javax.xml.bind.JAXB;
import java.io.File;

public class Test {
  public static void main(String[] args) {
    Person p = JAXB.unmarshal(new File("foo.xml"), Person.class);
    System.out.println(p.getName());
    System.out.println(p.getLat());
    System.out.println(p.getLon());
  }
}

我的foo.xml

<Person>
 <name>Fred</name>
 <lat>1.0</lat>
</Person>

输出:

Fred
1.0
null

答案 1 :(得分:0)

获得0.0返回vs null的最可能原因是使用Double基本类型或Double对象类型。如果值为null,则Double原语将默认为0.0,因为null不是原始类型的有效值。 Double对象将允许您为这些字段分配空值。你的Person类的一个高峰可能会揭示这一点。