我有一个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()
的返回值?
答案 0 :(得分:4)
我根本没有看到这个问题。对我来说,xjc
会生成Person
类,其中属性lat
和lon
类型为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类的一个高峰可能会揭示这一点。