gpt4 book ai didi

java - JAXB minOccurs=0。元素存在还是不存在?

转载 作者:行者123 更新时间:2023-11-30 07:38:29 25 4
gpt4 key购买 nike

我有一个 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>,返回值也是 0.0或<lon>元素。

更糟糕的是 0.0,0.0 是有效的纬度和经度。很少有人在那里,但这不是重点!

article IBM 站点上建议使用附加 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 必须有一种正确的方法来检查该元素是否存在,以便我可以信任来 self 的 getLat() 的返回值。 , getLon()

最佳答案

我根本没有看到这个问题。对我来说xjc生成 Person具有属性 lat 的类和lon类型 Double .

如果我解码一个没有 <lat> 的 XML 文件或<lon>元素,然后得到 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>

输出:

Fred1.0null

关于java - JAXB minOccurs=0。元素存在还是不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com