2009-11-26 4 views
2

나는 XML 스키마가 :JAXB minOccurs = 0. 요소가 존재 하는가?

<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 사이트의 article은 메타 데이터로 추가 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와 적절한 방법이 있어야합니까?

+0

Java 6의 JAXB 또는 1.5와 작동하는 별도의 lib를 사용하고 있습니까? 그 과정에서 JAXB가 클래스를 생성하는 방법이 변경되었습니다. 특히 어레이의 경우. 최신 버전을 사용해보십시오. –

+0

(패키지가 ws-jaxme-0.5.1-3.4.fc11.noarch 인 Fedora에서) JAXME을 사용하고 Java 6 (java-1.6.0-openjdk-1.6.0.0-30.b16.fc11.i586) . –

+0

이것은 JAXME 2.0의 JAXME 구현과 관련하여 특별히 문제가있는 것으로 보입니다. Sun의 구현으로 전환하면 요소가 XML 메시지에 포함되지 않은 경우 getter는 null 값을 반환합니다. –

답변

4

전혀 문제가 보이지 않습니다. 나에게 xjclatlon 유형이 DoublePerson 클래스를 생성합니다. 내가 기대했던 나는 더 <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> 

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

내 :

<Person> 
<name>Fred</name> 
<lat>1.0</lat> 
</Person> 

출력 :

Fred 
1.0 
null 
+2

방금 ​​예제를 시도했지만 제안대로 작동합니다. 이것은 좋은 소식입니다! 그것은 JAXB의 제한이 아니라 내 프로젝트의 문제점입니다. 고맙습니다! –

0

리턴 된 vs null을 얻는 가장 큰 이유는 Double 기본 유형 또는 Double 오브젝트 유형을 사용하기 때문입니다. Double 프리미티브는 null이 기본 유형에 유효한 값이 아니므로 값이 null 인 경우 기본값은 0.0입니다. Double 개체를 사용하면이 필드에 null 값을 할당 할 수 있습니다. Person 클래스의 최고점은 아마도 이것을 나타낼 것입니다.

+1

네, 당신이 더블 대 더블이 맞다고 생각합니다. 그러나 문제는 JAXME에서 xsd : double을 java 기본 double로 변환하고 Sun Java JAXB에서 xsd : double을 java Double로 변환하는 것으로 나타납니다. JAXME gererated 코드는 XML의 값이 설정되었는지 확인할 방법이 없습니다. 0.0은 위도와 경도에 유효한 값이므로 0.0을 확인하는 것은 바람직하지 않습니다. JAXB를 사용하도록 전환 했으므로 요소가 제공되었는지 확인하기 위해 null을 확인할 수 있습니다. –

관련 문제