質問

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()

からの戻り値を信頼できるように、JAXBには要素が存在するかどうかを確認する適切な方法が必要です。
役に立ちましたか?

解決

その問題はまったく見当たりません。私にとってはxjcは、プロパティPersonlatのタイプがlonDoubleクラスを生成します。

<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クラスのピークはおそらくこれを明らかにするでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top