2010-04-26 5 views
9

XML 스키마에서 Java 클래스를 생성하기 위해 xjc를 사용하고 있으며 다음은 XSD의 발췌 부분입니다.XJC를 사용하는 Java 클래스에 대한 XML 스키마

<xs:element name="NameInfo"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:choice> 
     <xs:element ref="UnstructuredName"/> <!-- This line --> 
     <xs:sequence> 
      <xs:element ref="StructuredName"/> 
      <xs:element ref="UnstructuredName" minOccurs="0"/> <!-- and this line! --> 
     </xs:sequence> 
     </xs:choice> 
     <xs:element ref="SomethingElse" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
생성 된 클래스는 괜찮 대부분의 경우

하지만 위의 블록 내가 좋아하는 뭔가를 얻을 것입니다 : 내가 가진

* You are getting this "catch-all" property because of the following reason: 
* The field name "UnstructuredName" is used by two different parts of a schema. See: 
* line XXXX of file:FILE.xsd 
* line XXXX of file:FILE.xsd 
* To get rid of this property, apply a property customization to one 
* of both of the following declarations to change their names: 
* Gets the value of the content property. 

: 위의 다음 코멘트와 함께

public List<Object> getContent() { 
    if (content == null) { 
    content = new ArrayList<Object>(); 
    } 
    return this.content; 
} 

을 문제의 두 줄 끝 부분에 주석을 달았습니다.

현재 스키마를 변경하는 것이 쉽지 않을 것이라고 생각합니다. 이는 공급 업체간에 결정 되었기 때문에 가능하면 진행 속도가 느려지므로이 방법을 사용하고 싶지 않습니다.

제가 검색 한 결과 this page을 찾았습니다. 내가하고 싶은 외부 사용자 정의입니까? 나는 대부분이 생성 된 클래스들로 작업 해 왔기 때문에이 클래스들을 생성하는 프로세스에 대해 완전히 익숙하지 않다. "속성 사용자 정의"의 간단한 예가 좋습니다! 스키마를 계속 사용할 수있는 한 Java 클래스를 생성하는 대체 방법은 좋을 것입니다.

편집 : 두 UnstructuredName이 실제로 동일한 요소임을 분명히해야합니다.

답변

1

여기서 중요한 문제는 <xs:sequence><xs:choice>으로 이루어져 있으며 Java에서 "a List"으로 변환된다는 것입니다. Java의 형식 구조는이 점을 충분히 표현할만큼 융통성이 없습니다.

바인딩 맞춤 설정 당신을 도울 수 있지만,이 경우 더 나은 방법으로이 정보를 나타낼 수 없으므로이 경우에는 의심 스럽습니다.

과거에 사용했던 다른 기술은 간단한 XSLT 변환을 통해 스키마를 전달하고, 구성 요소를 JAXB보다 친숙한 것으로 다시 배열하는 동시에 문서가 실제로 구현할 동일한 구조를 허용하는 것입니다 . 이렇게하면 원본을 변경하지 않고 스키마를 "변경할"수 있습니다.

+0

. 만약 내면의 "서열"을 다른 요소에 넣을 수 있다면이 문제는 해결 될 것인가? 그것은 변환으로 실현 가능한가? 변환을 수행하면 원하는 구조로 변환 한 다음 원래 구조로 다시 변환해야합니다. – nevets1219

2

동일한 문제가 있습니다. 나는 xmlbeans와 축으로 전환했다. XMLBeans는 문제없이 그리고 두통없이 스키마를 컴파일 할 수 있습니다. JaxB는 이것을 처리 할 수 ​​없습니다. JaxB가 이것을 처리하게하려면 스키마를 조금 바꿀 수 있습니다.

<xs:sequence> 
      <xs:choice> 
    <!-- changed the following line --> 
      <xs:element name="UnstructuredTop" type="UnstructuredName"/> 
    <!-- end of change --> 
      <xs:sequence> 
       <xs:element ref="StructuredName"/> 
       <xs:element ref="UnstructuredName" minOccurs="0"/> 
      </xs:sequence> 
      </xs:choice> 
      <xs:element ref="SomethingElse" minOccurs="0"/> 
    </xs:sequence> 

그런 다음 JAXB는 두 개의 구별 플립을하지 않습니다.

그러나 내 상황과 비슷합니다. 스키마 변경은 의문의 여지가있었습니다. 그래서 xmlBeans와 axis (sux)를 사용했다.

5

또한 바인딩 사용자 정의가 <xjc:simple />라고 사용할 수 있습니다

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       jxb:version="2.0"> 
     <jxb:globalBindings> 
      <xjc:simple /> 
     </jxb:globalBindings> 
</jxb:bindings> 

그러나이 (비록 XJC 것보다 다른 것을 사용한다) 공급 업체 고유의 것입니다 것을 adviced 바랍니다)

추가 정보 here

0

문제를 해결하기 위해 래퍼 클래스를 만들었습니다 :

List<JAXBElement<?>> contentList = address.getContent(); 
if (contentList != null && contentList.size() > 0) { 
    Address4JaxbMula address4JaxbMula = new Address4JaxbMula(contentList); 

... 나는 다시 배열 요소가이 경우에 할 수있는 방법을 아주 확실하지 않다

}

...

public static class Address4JaxbMula { 
    public CountryCodeType countryCode; 
    public AddressFixType addressFix; 
    public String addressFree; 

    public Address4JaxbMula(List<JAXBElement<?>> contentList) { 
     if (contentList != null && contentList.size() > 0) { 
      for (JAXBElement<?> content : contentList) { 
       Object value = content.getValue(); 
       if (value.getClass().isAssignableFrom(CountryCodeType.class)) { 
        countryCode = (CountryCodeType) content.getValue(); 
       } else if (value.getClass().isAssignableFrom(AddressFixType.class)) { 
        addressFix = (AddressFixType) content.getValue(); 
       } else { 
        addressFree = (String) value; 
       } 
      } 
     } 
    } 

}