검색

36장. 와일드 카드 유형 사용

download PDF

초록

스키마 작성자가 바인딩 요소 또는 특성을 정의된 형식으로 연기하려는 경우가 있습니다.There are instances when a schema author want to defer binding elements or attributes to a defined type. 이러한 경우 XML 스키마는 와일드카드 위치 소유자를 지정하기 위한 세 가지 메커니즘을 제공합니다. 이러한 모든 것은 XML 스키마 기능을 유지하는 방식으로 Java에 매핑됩니다.

36.1. 모든 요소 사용

36.1.1. 개요

XML Schema any 요소는 복잡한 유형 정의에서 와일드 카드 장소 홀더를 만드는 데 사용됩니다. XML 스키마에 대해 XML 요소를 인스턴스화하는 경우 모든 유효한 XML 요소가 될 수 있습니다.When an XML element is instantiated for an XML Schema any element, it can be any valid XML element. 모든 요소에는 인스턴스화된 XML 요소의 콘텐츠 또는 이름에 제한이 없습니다.

예를 들어 예 36.1. “XML 스키마 유형 : Any Element” 에 정의된 복잡한 유형이 제공되면 예 36.2. “모든 요소가 포함된 XML 문서” 에 표시된 XML 요소 중 하나를 인스턴스화할 수 있습니다.

예 36.1. XML 스키마 유형 : Any Element

<element name="FlyBoy">
  <complexType>
    <sequence>
      <any />
      <element name="rank" type="xsd:int" />
    </sequence>
  </complexType>
</element>

예 36.2. 모든 요소가 포함된 XML 문서

<FlyBoy>
  <learJet>CL-215</learJet>
  <rank>2</rank>
</element>
<FlyBoy>
  <viper>Mark II</viper>
  <rank>1</rank>
</element>

XML 스키마 모든 요소는 Java Object 개체 또는 Java org.w3c.dom.Element 개체에 매핑됩니다.

36.1.2. XML 스키마 지정

모든 요소는 시퀀스 복잡한 유형을 정의하고 복잡한 유형을 선택할 때 사용할 수 있습니다. 대부분의 경우 모든 요소는 빈 요소입니다. 그러나 주석 요소를 자식으로 사용할 수 있습니다.

표 36.1. “XML Schema Any Element의 특성” 모든 요소의 속성을 설명합니다.

표 36.1. XML Schema Any Element의 특성
속성설명

namespace

XML 문서의 요소를 인스턴스화하는 데 사용할 수 있는 요소의 네임스페이스를 지정합니다.Specifies the namespace of the elements that can be used to instantiate the element in an XML document. 유효한 값은 다음과 같습니다.

##any
네임스페이스의 요소를 사용할 수 있도록 지정합니다. 이는 기본값입니다.
##기타
부모 요소의 네임스페이스 이외의 모든 네임스페이스의 요소 를 사용할 수 있도록 지정합니다.
##local
네임스페이스가 없는 요소를 사용해야 합니다.
##targetNamespace
부모 요소의 네임스페이스의 요소를 사용할 수 있도록 지정합니다.
공백으로 구분된 URI 목록 #\#local\#targetNamespace
나열된 네임스페이스의 요소를 사용할 수 있도록 지정합니다.

maxOccurs

요소의 인스턴스가 부모 요소에 표시될 수 있는 최대 횟수를 지정합니다.Specifies the maximum number of times an instance of the element can appear in the parent element. 기본값은 1 입니다. 요소의 인스턴스가 무제한으로 표시될 수 있도록 지정하려면 특성 값을 unbounded 로 설정할 수 있습니다.

minOccurs

요소의 인스턴스가 부모 요소에 나타날 수 있는 최소 횟수를 지정합니다.Specifies the minimum number of times an instance of the element can appear in the parent element. 기본값은 1 입니다.

processContents

요소를 인스턴스화하는 데 사용되는 요소를 유효성 검사해야 하는 방법을 지정합니다.Specifies how the element used to instantiate the any element should be validated. 유효한 값은 다음과 같습니다.

strict
적절한 스키마에 대해 요소의 유효성을 검사하도록 지정합니다.Specifies that the element must be validated against the proper schema. 이는 기본값입니다.
lax
적절한 스키마에 대해 요소를 검증하도록 지정합니다. 유효성을 검사할 수 없는 경우 오류가 발생하지 않습니다.
skip
요소를 유효성 검사를 수행할 수 없도록 지정합니다.Specifies that the element should not be validated.

예 36.3. “모든 요소를 사용하여 정의되는 복합 유형” 모든 요소를 사용하여 정의된 복잡한 형식을 보여줍니다.

예 36.3. 모든 요소를 사용하여 정의되는 복합 유형

<complexType name="surprisePackage">
  <sequence>
    <any processContents="lax" />
    <element name="to" type="xsd:string" />
    <element name="from" type="xsd:string" />
  </sequence>
</complexType>

36.1.3. Java로의 매핑

XML 스키마를 사용하면 모든 요소(element)라는 Java 속성이 생성됩니다. 속성에는 getter 및 setter 메서드가 연결되어 있습니다. 결과 속성의 유형은 요소의 processContents 특성 값에 따라 다릅니다. 모든 요소의 processContents 특성이 건너뛰도록 설정된 경우 해당 요소는 org.w3c.dom.Element 개체에 매핑됩니다.If the element's processContents attribute is set to skip, the element is mapped to a org.w3c.dom.Element object. processContents 특성의 다른 모든 값에 대해 모든 요소 가 Java Object 오브젝트에 매핑됩니다.

생성된 속성은 @XmlAnyElement 주석으로 장식됩니다. 이 주석에는 데이터를 마샬링할 때 런타임에 수행할 작업을 지시하는 선택적 lax 속성이 있습니다. 기본값은 false 이며 런타임에 자동으로 데이터를 org.w3c.dom.Element 개체로 마샬링하도록 지시합니다. laxtrue 로 설정하면 런타임에 데이터를 JAXB 유형으로 마샬링하려고 합니다. 모든 요소의 processContents 특성이 건너뛰 도록 설정되면 Lax 속성이 기본값으로 설정됩니다. processContents 특성의 다른 모든 값의 경우 laxtrue 로 설정됩니다.

예 36.4. “모든 요소가 있는 Java 클래스” 예 36.3. “모든 요소를 사용하여 정의되는 복합 유형” 에 정의된 복잡한 유형이 Java 클래스에 매핑되는 방법을 보여줍니다.

예 36.4. 모든 요소가 있는 Java 클래스

public class SurprisePackage {

    @XmlAnyElement(lax = true) protected Object any;
    @XmlElement(required = true)
    protected String to;
    @XmlElement(required = true)
    protected String from;

    public Object getAny() { return any; }

    public void setAny(Object value) { this.any = value; }

    public String getTo() {
        return to;
    }

    public void setTo(String value) {
        this.to = value;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String value) {
        this.from = value;
    }

}

36.1.4. 마샬링

모든 요소에 대한 Java 속성에 La xfalse 로 설정되어 있거나 속성이 지정되지 않은 경우 런타임에서 XML 데이터를 JAXB 개체에 구문 분석하지 않습니다. 데이터는 항상 DOM Element 객체에 저장됩니다.

모든 요소에 대한 Java 속성에 laxtrue 로 설정된 경우 런타임은 XML 데이터를 적절한 JAXB 개체에 마샬링하려고 합니다. 런타임은 다음 절차를 사용하여 적절한 JAXB 클래스를 식별하려고 시도합니다.

  1. XML 요소의 요소 태그를 런타임에 알려진 요소 목록에 대해 확인합니다. 일치하는 항목이 있으면 런타임은 XML 데이터를 요소에 대한 적절한 JAXB 클래스로 마샬링합니다.
  2. XML 요소의 xsi:type 속성을 확인합니다. 일치하는 항목을 찾으면 런타임에서 XML 요소를 해당 유형의 적절한 JAXB 클래스로 마샬링합니다.
  3. 일치하는 항목을 찾을 수 없는 경우 XML 데이터를 DOM Element 개체로 마샬링합니다.

일반적으로 애플리케이션의 런타임은 스키마에서 생성된 모든 유형의 계약에 대해 알고 있습니다. 여기에는 계약의 wsdl:types 요소에 정의된 유형, 포함을 통해 계약에 추가된 모든 데이터 유형, 다른 스키마를 가져와서 계약에 추가된 모든 유형이 포함됩니다. 32.4절. “런타임 Marshaller에 클래스 추가” 에서 설명하는 @XmlSeeAlso 주석을 사용하여 런타임에서 추가 유형을 인식할 수도 있습니다.

36.1.5. unmarshalling

모든 요소에 대한 Java 속성이 false 로 설정되어 있거나 속성이 지정되지 않은 경우 런타임은 DOM Element 객체만 허용합니다. 다른 유형의 개체를 사용하려고 하면 마샬링 오류가 발생합니다.

모든 요소의 Java 속성에 laxtrue 로 설정된 경우 런타임은 Java 데이터 형식과 XML Schema 구문 간의 내부 맵을 사용하여 유선에 쓸 XML 구조를 결정합니다. 런타임에서 클래스를 알고 XML 스키마 구문에 매핑할 수 있는 경우 데이터를 작성하고 xsi:type 속성을 삽입하여 요소에 포함된 데이터 유형을 식별합니다.If the runtime knows the class and can map it to an XML Schema construct, it writes out the data and inserts an xsi:type attribute to identify the type of data the element contains.

런타임에서 Java 개체를 알려진 XML 스키마 구성에 매핑할 수 없는 경우 마샬링 예외가 발생합니다. 32.4절. “런타임 Marshaller에 클래스 추가” 에서 설명하는 @XmlSeeAlso 주석을 사용하여 런타임 맵에 유형을 추가할 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.