JAXB minOccurs = 0。要素が存在するかどうか?
質問
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サイトの記事追加の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>
これはいハックのようです。 getLat()
、getLon()
?
解決
その問題はまったく見当たりません。私にとってはxjc
は、プロパティPerson
とlat
のタイプがlon
のDouble
クラスを生成します。
<lat>
または<lon>
要素のないXMLファイルをアンマーシャリングすると、期待どおり、結果のnull
オブジェクトにはこれらのプロパティの0.0
値があります。
どこでTest.java
を取得するかわかりません。
私の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>
マイfoo.xml
:
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());
}
}
マイ<=>:
<Person>
<name>Fred</name>
<lat>1.0</lat>
</Person>
出力:
Fred 1.0 null
他のヒント
0.0が返されるvs nullを取得する最も可能性の高い理由は、Doubleプリミティブ型またはDoubleオブジェクト型の使用です。 nullはプリミティブ型の有効な値ではないため、値がnullの場合、Doubleプリミティブはデフォルトで0.0になります。 Doubleオブジェクトを使用すると、これらのフィールドにnull値を割り当てることができます。 Personクラスのピークはおそらくこれを明らかにするでしょう。