2012-01-02 1 views
3

XSD에서 Java 파일을 만들려면 JAXB 및 intellij webservices 플러그인을 사용하고 있습니다. 두 개의 XSD가 동일한 객체를 정의하지만 "XML 스키마에서 Java 코드 생성"을 사용하여 객체를 만들면 객체가 자체 패키지로 두 번 생성됩니다. import xsd를 사용하고 ref 속성을 사용하여 이미 시도했지만 동일한 결과를 얻습니다. 이것은 I 그 제한이 동일한 개체 것 원하는 제 XSD동일한 사용자 지정 개체를 사용하도록 두 XSD를 만드는 방법

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema targetNamespace="http://www.msp-gs.com/workflow" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:fd="http://www.example.com/workflow" 
     attributeFormDefault="unqualified" 
     elementFormDefault="qualified" 
     jaxb:version="1.0"> 

     <xs:annotation> 
     <xs:appinfo> 
     <jaxb:globalBindings enableJavaNamingConventions="true"> 

     </jaxb:globalBindings> 
    </xs:appinfo> 
     </xs:annotation> 

    <xs:element name="FD"> 

     <xs:complexType> 

     <xs:sequence> 

      <xs:element name="Example" 
         type="fd:Restriction" 
         minOccurs="1" 
         maxOccurs="unbounded"> 

      </xs:element> 

     </xs:sequence> 

    </xs:complexType> 

    </xs:element> 

    <xs:complexType name="Restriction"> 

    <xs:attribute type="xs:string" 
        name="authorizationTreeId"/> 

    </xs:complexType> 

    </xs:schema> 

이다

이 제 XSD

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema targetNamespace="http://www.msp-gs.com/workflow" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:wc="http://www.example.com/workflow" 
     attributeFormDefault="unqualified" 
     elementFormDefault="qualified" 
     jaxb:version="1.0"> 

    <xs:annotation> 
    <xs:appinfo> 
     <jaxb:globalBindings enableJavaNamingConventions="true"> 

     </jaxb:globalBindings> 
    </xs:appinfo> 
    </xs:annotation> 

    <xs:element name="WC"> 

    <xs:complexType> 

     <xs:sequence> 

      <xs:element name="Example" 
         type="wc:Restriction" 
         minOccurs="1" 
         maxOccurs="unbounded"> 

      </xs:element> 

     </xs:sequence> 

     </xs:complexType> 

    </xs:element> 

    <xs:complexType name="Restriction"> 

     <xs:attribute type="xs:string" 
        name="authorizationTreeId"/> 

    </xs:complexType> 

    </xs:schema> 

이다 : 여기

는 일례이다.

감사합니다.

+1

체크 아웃 다음 기사 : http://blog.bdoughan.com/2011/12/reusing-generated-jaxb- classes.html –

+1

고마워요. 지금 당장 들어가서 작동하는지 알려 드리겠습니다. 다시 감사합니다. – Rotem

+0

@Rotem : 두 경우 모두 하나의 XSD 파일 사용을 중단하게하는 요인은 무엇입니까? 두 개의 XSD의 문제점은 모델 객체를 두 번 생성해야한다는 것입니다.하지만 동일한 출력 디렉토리를 사용하면 두 번째 실행이 첫 번째를 우선 적용합니다. 또는 스키마 생성 (복사/정리) 후에 몇 가지 트릭을 수행 할 수 있습니다. –

답변

3

다음과 같은 외부 바인딩 파일을 사용하여 JAXB를 생성하는 대신 기존 Java 클래스를 사용하도록 JAXB에 지시 할 수 있습니다. 우리는 JAXB가 기존의 Product 클래스 사용 말하고있다 아래의 예에서 : 당신은 XML 스키마에서 클래스를 생성하는 XJC 도구를 사용하는 경우

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb"> 
    <bindings scd="x-schema::tns" 
    xmlns:tns="http://www.example.org/Product"> 
    <schemaBindings map="false"/> 
    <bindings scd="tns:product"> 
     <class ref="org.example.product.Product"/> 
    </bindings> 
    </bindings> 
</bindings> 

을, 당신은 XJC이 바인딩 파일을 생성해야하는 -episode 플래그를 사용할 수 있습니다 그것이 생성 한 모든 클래스를 가리킨다. 이렇게하면 이전에 생성 된 클래스를 다시 사용할 수 있습니다. 추가 정보

xjc -d out -episode product.episode Product.xsd 

+0

개미 작업을 사용하는 경우 다음과 같이 episode 인수를 사용할 수 있습니다. Rotem

관련 문제