2017-05-17 2 views
0

내 스키마의 xsd:unique 제약 조건은 소수 요소의 기본 키와 외래 키를 정의합니다.xsd : Java 클래스 내 고유

스키마가 오류를 발생시키지 않지만.

Java 클래스 xsd:unique 생성 중에는 추가되지 않습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xsd:import namespace="urn:schemas-microsoft-com:xml-msdata" schemaLocation="msdata.xsd" /> 
    <xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="subroot"> 
      <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element minOccurs="0" name="set"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:any processContents="lax" /> 
        <xsd:choice> 
         <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" name="Held"> 
          <xsd:complexType> 
          <xsd:attribute name="_attr1" use="required" type="xsd:integer" /> 
          <xsd:attribute name="_attr2" use="required" type="xsd:integer" /> 
          </xsd:complexType> 
         </xsd:element> 
         <xsd:element maxOccurs="unbounded" name="Asses"> 
          <xsd:complexType> 
          <xsd:attribute name="_attr2" use="required" type="xsd:integer" /> 
          <xsd:attribute name="_attr3" use="required" type="xsd:NCName" /> 
          </xsd:complexType> 
         </xsd:element> 
         </xsd:sequence> 
        </xsd:choice> 
        </xsd:sequence> 
       </xsd:complexType> 
       <xsd:unique name="PK_Held" msdata:PrimaryKey="true"> 
        <xsd:selector xpath="xsd:Held"></xsd:selector> 
        <xsd:field xpath="@_attr1"></xsd:field> 
       </xsd:unique> 
       <xsd:unique name="PK_Asses" msdata:PrimaryKey="true"> 
       <xsd:selector xpath="xsd:Asses"></xsd:selector> 
       <xsd:field xpath="@_attr2"></xsd:field> 
       </xsd:unique> 
       <xsd:keyref name="FK_Held_Asses" refer="PK_Asses"> 
       <xsd:selector xpath="xsd:Held"></xsd:selector> 
       <xsd:field xpath="@_attr2"></xsd:field> 
       </xsd:keyref> 
       </xsd:element> 
      </xsd:sequence> 
       </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+1

JAXB는 유효성 검사 규칙을 시행하지 않습니다. 유효성 검사 규칙을 적용하려면 유효성 검사를 사용하여 XML을 구문 분석 할 때 XSD 스키마를 지정해야합니다. – Andreas

+0

@ Andreas 나는 의견보다는 대답으로 자격이 있다고 생각한다. 어쩌면 Schema 인스턴스를 생성하고 unmarshaller에 그것을 설정하는 방법에 관한 간단한 스 니펫으로 게시 할 것인가? –

+0

감사합니다. Andreas, 하나의 추가 정보 --- 이것은 XML을 제공하는 공급 업체이며 우리는 그것을 사용하여 스키마를 생성했습니다. 그들은 xml 자체에서 고유 한 제약 조건을 전송하므로 ''태그에서 구문 분석이 실패합니다. – thiagu

답변

1

JAXB는 유효성 검사 규칙을 시행하지 않습니다.

유효성 검사 규칙을 적용하려면 XML을 구문 분석 할 때 XSD 스키마를 지정해야합니다.

Unmarshaller에 XML을 구문 분석하도록 요청하면 (예 : 당신이 DOM 노드를 비 정렬 화하지 않는, 당신은 이런 식으로 작업을 수행합니다

검증과 정형식

클라이언트 :이 Unmarshaller의 자바 독에 설명되어

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(schemaFile); // file or URL 

JAXBContext jaxbContext = JAXBContext.newInstance(); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
unmarshaller.setSchema(schema); 
unmarshaller.setEventHandler(handler); // To specify how validation errors should be handled 
Object obj = unmarshaller.unmarshal(source); 

응용 프로그램은 setSchema(javax.xml.validation.Schema) API를 통해 JAXP 1.3 유효성 확인 메커니즘을 활성화 또는 비활성화 할 수 있습니다. 정교한 클라이언트는 자체 유효성 검사 SAX 2.0 호환 파서를 지정하고 unmarshal(Source) API를 사용하여 JAXP 1.3 유효성 검사 메커니즘을 우회 할 수 있습니다.

잘못된 XML 컨텐츠의 비 정렬 화가 JAXB 2.0에 정의되었으므로 Unmarshaller 기본 유효성 검사 이벤트 핸들러가 JAXB 1.0보다 완화되었습니다. JAXB 1.0 바인딩 컴파일러에서 생성 된 스키마 파생 코드가 JAXBContext으로 등록 된 경우 기본 비 정렬 화 유효성 처리기는 DefaultValidationEventHandler이고 치명적인 오류나 오류가 발생하면 마샬 작업을 종료합니다. JAXB 2.0 클라이언트 애플리케이션의 경우 명시 적으로 정의 된 기본 유효성 검사기가 없으며 기본 이벤트 처리는 치명적인 오류가 발생한 후에 비동기식 조작 만 종료합니다.

+0

게시물 Andreas에게 감사드립니다. – thiagu