我有一个 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()?
我根本看不出这个问题。对我来说,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>
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 空值
| 归档时间: |
|
| 查看次数: |
6332 次 |
| 最近记录: |