У меня есть схема 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()
, возвращаемые значения равны 0.0, даже если исходный XML не содержал <lat>
или <lon>
элементов.
Что еще хуже, это то, что 0.0, 0.0 - это действительные широта и долгота. Человек редко бывает там, но это не относится к делу!
В статье на сайте 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 должен быть правильный способ проверить, существует ли элемент, чтобы я мог доверять возвращаемому значению из моих getLat()
, getLon()
?