36장. 와일드 카드 유형 사용
초록
스키마 작성자가 바인딩 요소 또는 특성을 정의된 형식으로 연기하려는 경우가 있습니다.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의 특성” 모든
요소의 속성을 설명합니다.
속성 | 설명 |
---|---|
| XML 문서의 요소를 인스턴스화하는 데 사용할 수 있는 요소의 네임스페이스를 지정합니다.Specifies the namespace of the elements that can be used to instantiate the element in an XML document. 유효한 값은 다음과 같습니다.
|
|
요소의 인스턴스가 부모 요소에 표시될 수 있는 최대 횟수를 지정합니다.Specifies the maximum number of times an instance of the element can appear in the parent element. 기본값은 |
|
요소의 인스턴스가 부모 요소에 나타날 수 있는 최소 횟수를 지정합니다.Specifies the minimum number of times an instance of the element can appear in the parent element. 기본값은 |
| 요소를 인스턴스화하는 데 사용되는 요소를 유효성 검사해야 하는 방법을 지정합니다.Specifies how the element used to instantiate the any element should 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
개체로 마샬링하도록 지시합니다. lax
를 true
로 설정하면 런타임에 데이터를 JAXB 유형으로 마샬링하려고 합니다. 모든
요소의 processContents
특성이 건너뛰
도록 설정되면 Lax
속성이 기본값으로 설정됩니다. processContents
특성의 다른 모든 값의 경우 lax
는 true
로 설정됩니다.
예 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 x
가 false
로 설정되어 있거나 속성이 지정되지 않은 경우 런타임에서 XML 데이터를 JAXB 개체에 구문 분석하지 않습니다. 데이터는 항상 DOM Element
객체에 저장됩니다.
모든
요소에 대한 Java 속성에 lax
가 true
로 설정된 경우 런타임은 XML 데이터를 적절한 JAXB 개체에 마샬링하려고 합니다. 런타임은 다음 절차를 사용하여 적절한 JAXB 클래스를 식별하려고 시도합니다.
- XML 요소의 요소 태그를 런타임에 알려진 요소 목록에 대해 확인합니다. 일치하는 항목이 있으면 런타임은 XML 데이터를 요소에 대한 적절한 JAXB 클래스로 마샬링합니다.
-
XML 요소의
xsi:type
속성을 확인합니다. 일치하는 항목을 찾으면 런타임에서 XML 요소를 해당 유형의 적절한 JAXB 클래스로 마샬링합니다. -
일치하는 항목을 찾을 수 없는 경우 XML 데이터를 DOM
Element
개체로 마샬링합니다.
일반적으로 애플리케이션의 런타임은 스키마에서 생성된 모든 유형의 계약에 대해 알고 있습니다. 여기에는 계약의 wsdl:types
요소에 정의된 유형, 포함을 통해 계약에 추가된 모든 데이터 유형, 다른 스키마를 가져와서 계약에 추가된 모든 유형이 포함됩니다. 32.4절. “런타임 Marshaller에 클래스 추가” 에서 설명하는 @XmlSeeAlso
주석을 사용하여 런타임에서 추가 유형을 인식할 수도 있습니다.
36.1.5. unmarshalling
모든
요소에 대한 Java 속성이 false
로 설정되어 있거나 속성이 지정되지 않은 경우 런타임은 DOM Element
객체만 허용합니다. 다른 유형의 개체를 사용하려고 하면 마샬링 오류가 발생합니다.
모든
요소의 Java 속성에 lax
가 true
로 설정된 경우 런타임은 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
주석을 사용하여 런타임 맵에 유형을 추가할 수 있습니다.