2011-09-05 4 views
3

기존 xml 스키마를 기존 Java 클래스에 매핑 할 수 있습니까?기존 클래스와 스키마가있는 jaxb

나는 여러 xml 스키마가 있으므로 하나의 Java 클래스에 모두 매핑해야합니다. Xml 파일은 데이터를 저장하는 방식이 조금 다릅니다. 예.

public class DataStorage { 
    public String data1; 
    public String data2; 
    public String data3; 
} 

및 세트 다른 xml 파일

<?xml ...?> 
<dataCase1> 
<data1>...</data1> 
<data2>...</data2> 
<data3>...</data3> 
</dataCase1> 

<?xml ...?> 
<dataCase2> 
<data data1="..." data2="..." data3="..." /> 
</dataCase2> 

<?xml ...?> 
<dataCase3> 
<data> 
<innerData> 
<data1>...</data1> 
</innerData> 
<otherData data2="..."> 
<data3>...</data3> 
</otherData> 
</data> 
</dataCase3> 

xml 파일의 다른 많은 변형이있을 수 있습니다.

jaxb를 사용하여 모든 파일을 Java 클래스에 바인딩 할 수 있습니까?

+0

예, 가능합니다. 각 xml-schema에 대한 패키지를 빌드하고이를 클래스에 바인드하십시오. – umbr

+0

더 자세히 설명해 주시겠습니까? –

답변

2

달성하려면 EclipseLink MOXy JAXB 구현을 사용할 수 있습니다. 내가 이해하는 한, 당신은 여전히 ​​다른 유형의 스키마를 위해 다른 클래스를 생성해야하지만 도메인 객체를 재사용 할 수 있습니다.

은 예를 계속하려면 :

DataStorage 단순하게 Strings로 표현 3 개의 도메인 오브젝트 (data1, data2, data3)와 클래스는 정말 어떤 JAXB 도메인 객체를 매핑 할 수 있습니다.

  • 스키마 유형 1

    @XmlRootElement(name = "dataCase") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class DataStorage { 
        private String data1; 
        private String data2; 
        private String data3; 
    
        /** 
        * No-arg ctor needed by jaxb. 
        */ 
        private DataStorage() {} 
    
        public DataStorage(String data1, String data2, String data3) { 
         this.data1 = data1; 
         this.data2 = data2; 
         this.data3 = data3; 
        } 
    
    } 
    
  • 스키마 유형 2. 주석 @XmlPath 주석을 사용합니다.

    @XmlRootElement(name = "dataCase") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class DataStorage { 
        @XmlPath("data/@data1") 
        private String data1; 
        @XmlPath("data/@data2") 
        private String data2; 
        @XmlPath("data/@data3") 
        private String data3; 
    .... 
    
  • 스키마 유형 3. 다시 @XmlPath을 활용하십시오. 마샬링

    JAXBContext jc = JAXBContext.newInstance(DataStorage.class); 
    Marshaller marshaller = jc.createMarshaller(); 
    DataStorage dataStorage = new DataStorage("data 1", "data 2", "data 3"); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(dataStorage, System.out); 
    

@XmlRootElement(name = "dataCase") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class DataStorage { 
    @XmlPath("data/innerData/data1/text()") 
    private String data1; 
    @XmlPath("data/otherData/@data2") 
    private String data2; 
    @XmlPath("data/otherData/data3/text()") 
    private String data3; 
.... 
  • 나 정보는 MOXY 팀 리드의 블로그에서 this post를 참조하십시오.

  • +0

    +1 - MOXy의 XML 메타 데이터 파일을 사용하여 도메인 모델에 여러 매핑을 적용 할 수도 있습니다. 예를 보려면 다음을 참조하십시오. http://stackoverflow.com/questions/6838882/jaxb-annotations-extract-xml-value-from-xml-element –

    +0

    @Blaise 멋지군요. 이것은 유용 할 것입니다. –

    +0

    다음은 하나의 객체 모델에 여러 매핑을 보여주는 예제입니다. http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple- xml-schemas.html –

    1

    XSLT를 사용하여 다양한 XML 형식을 하나의 통합 된 형식으로 변환 할 수 있습니다.