문제

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 메시지를 Unmarshal하고 개인 개체 인스턴스를 얻습니다. 내가 할 때 p.getLat() 또는 p.getLon() 원래 XML에 포함하지 않더라도 반환 값은 0.0입니다. <lat> 또는 <lon> 집단.

이것을 악화시키는 것은 0.0, 0.0이 유효한 위도와 경도라는 것입니다. 사람이 그곳에있는 것은 드물지만 요점 옆에 있습니다!

an 기사 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()?

도움이 되었습니까?

해결책

나는 그 문제를 전혀 보지 못한다. 나를 위한 xjc a Person 속성과 클래스 lat 그리고 lon 유형으로 Double.

내가 no가있는 XML 파일을 모색하지 않으면 <lat> 또는 <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>

산출:

Fred
1.0
null

다른 팁

0.0을 얻는 가장 큰 이유는 vs null이 이중 원시 유형 또는 이중 객체 유형을 사용하기 때문입니다. NULL은 원시 유형의 유효한 값이 아니기 때문에 값이 NULL 인 경우 이중 원시는 기본값이 0.0으로 기본적으로 0.0으로 표시됩니다. 이중 객체를 사용하면이 필드에 널 값을 할당 할 수 있습니다. 당신의 개인 수업의 절정은 아마도 이것을 드러낼 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top