2012-10-23 3 views
1

JAXB for Java-xml 바인딩을 사용하고 있습니다. 처음 도메인 클래스를 만든 다음 schemagen 명령 줄 도구를 사용하여 다음 스키마가 생성되었습니다. 그러나 생성 된 스키마가 유효하지 않아 다음과 같은 오류 메시지가 나타납니다.JAXB : xs : extension을 사용하는 동안 요소 순서를 무시합니다.

오류 메시지 : COS-모든 limited.1.2 : 모든 모델 그룹 {분 발생} = {최대 발생} = 1 인 경우, 그 입자가 한 쌍의 일부이어야 가진 입자에 표시해야하는 복합 유형 정의의 {content type}을 구성합니다.

사용 사례 : Emp (기본 클래스)와 Dept (하위 클래스)의 두 클래스가 있습니다.
1. 요소 순서에 대한 제한이 없습니다 (empId, deptId 및 deptName이 임의의 순서로 나타날 수 있음을 의미 함). 그래서 우리는 xs : all 요소를 사용했습니다.
2. Dept 클래스에서 deptId 필드는 한 번만 나타납니다 (minOccurs = 1, maxOccurs = 1). deptName은 선택 사항입니다.
유효한 나의 스키마에 따라 유효한 스키마를 생성 할 수 없습니다. 나는 Google에서 검색했습니다. 그러나 나는 해결책을 찾지 못했습니다. 그래서 전문가가이 쿼리에 대답 할 수있을 것으로 기대하고 있습니다. 클래스, 스키마, 그리고 올바른 방향으로 나를 인도 해주세요.

참고 : 일부 임시 도메인 클래스를 만들지 말라.
미리 감사드립니다.

Emp.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name="EmpType", propOrder={}) 
@XmlRootElement 
public class Emp { 

    @XmlElement(name="empId", required = true) 
    private String empId; 
} 

Dept.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name="DeptType", propOrder={}) 
public class Dept extends Emp 
{ 

    @XmlElement(name="deptId", required = true) 
    private String deptId; 
    private String deptName; 
} 

Schema1.xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="emp" type="EmpType"/> 

    <xs:complexType name="EmpType"> 
    <xs:sequence> 
     <xs:element name="empId" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="DeptType"> 
    <xs:complexContent> 
     <xs:extension base="EmpType"> 
     <xs:all> <!--showing error message, mentioned above --> 
      <xs:element name="deptId" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="deptName" type="xs:string" minOccurs="0"/> 
     </xs:all> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

답변

1

문서 STR 실제로 XML 스키마에서 표현하기가 어렵습니다. 주석이 달린 모델 JAXB (JSR-222)에서 생성하지 못할 수 있습니다. 당신이 당신의 XML 스키마와 XML 내용의 유효성을 검사하지 않는 경우 간단한 XML 스키마

를 생성하고 단순히 사람들이 사용할 수있는 문서로 사용 -

옵션 # 1 : 당신은 그러나 몇 가지 옵션이 있습니까 가이드로서 그러면 all 섹션을 삭제하고 대신 sequence을 사용합니다. 이것은 당신이 가진 상속 관계에서 더 잘 작동 할 것입니다. UnmarshallerSchema의 인스턴스를 지정하지 않으면 요소 순서가 적용되지 않으므로 규칙을 충족하는 모든 XML 문서를 읽을 수 있습니다.

옵션 # 2 - 만들기 당신이 XML 스키마는 정확히 당신이 그것을 직접 작성해야합니다 모든 가능한 허용 입력을 반영하려면 자신의 XML 스키마

. 패키지 수준 @XmlSchema 주석을 사용하여이 기존 XML 스키마를 참조 할 수 있습니다.

@XmlSchema(location = "http://www.example.com/package/YourSchema.xsd") 
package com.example; 

import javax.xml.bind.annotation.XmlSchema; 
+1

자세한 답변을 보내 주셔서 감사합니다. 시퀀스를 무시해야하므로 상속 관계가 제거되고 xs : all을 사용하여 개별 클래스가 만들어졌습니다. – user1635014