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

Lei*_*ldt 2 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>
Run Code Online (Sandbox Code Playgroud)

我有一条 XML 消息:

<Person>
 <name>Fred</name>
</Person>
Run Code Online (Sandbox Code Playgroud)

我使用 JAXB 自动生成我的类(即 Person.java 等)。

所以在运行时我使用 JAXB 来解组上述 XML 消息并获得一个 Person 对象实例。当我执行 a p.getLat()or 时p.getLon(),即使原始 XML 不包含<lat>or<lon>元素,返回值为 0.0 。

更糟糕的是 0.0, 0.0 是有效的纬度和经度。一个人在那里的情况很少见,但这无关紧要!

文章在IBM网站上使用附加的XML元素作为元数据来明确说明可选元素是否存在建议。IE

<xsd:element name="hasLat" type="xsd:boolean"/>
<xsd:element name="hasLon" type="xsd:boolean"/>
Run Code Online (Sandbox Code Playgroud)

所以上面的 XML 消息会变成:

<Person>
 <name>Fred</name>
 <hasLat>false</hasLat>
 <hasLon>false</hasLon>
</Person>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个丑陋的黑客。JAXB 必须有一种正确的方法来检查元素是否存在,以便我可以信任来自我的getLat(), getLon()?

Joa*_*uer 6

我根本看不出这个问题。对我来说,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>
Run Code Online (Sandbox Code Playgroud)

我的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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我的foo.xml

<Person>
 <name>Fred</name>
 <lat>1.0</lat>
</Person>
Run Code Online (Sandbox Code Playgroud)

输出:

弗雷德
1.0
空值

  • 我刚刚试过你的例子,它按照你的建议工作。这是个好消息!这不是 JAXB 的限制,而是我的项目的问题。谢谢! (4认同)