#10 - Union and list typesΒΆ
Code Generation
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation>
This example illustrates list and union types.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="sizes" type="SizesType"/>
<xsd:complexType name="SizesType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="size" type="SizeType"/>
<xsd:element name="smallSize" type="SmallSizeType"/>
<xsd:element name="internationalSize" type="InternationalSizeType"/>
<xsd:element name="availableSizes" type="AvailableSizesType"/>
<xsd:element name="applicableSizes" type="ApplicableSizesType"/>
</xsd:choice>
</xsd:complexType>
<xsd:simpleType name="SizeType">
<xsd:union memberTypes="DressSizeType">
<xsd:simpleType>
<xsd:restriction base="xsd:token">
<xsd:enumeration value="small"/>
<xsd:enumeration value="medium"/>
<xsd:enumeration value="large"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
<xsd:simpleType name="DressSizeType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="18"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="SmallSizeType">
<xsd:restriction base="SizeType">
<xsd:enumeration value="2"/>
<xsd:enumeration value="4"/>
<xsd:enumeration value="6"/>
<xsd:enumeration value="small"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="InternationalSizeType">
<xsd:union memberTypes="SizeType">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="24"/>
<xsd:maxInclusive value="54"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
<xsd:simpleType name="AvailableSizesType">
<xsd:list itemType="SizeType"/>
</xsd:simpleType>
<xsd:simpleType name="ApplicableSizesType">
<xsd:restriction>
<xsd:simpleType>
<xsd:list itemType="SizeType"/>
</xsd:simpleType>
<xsd:enumeration value="small medium large"/>
<xsd:enumeration value="2 4 6 8 10 12 14 16 18"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
from dataclasses import dataclass, field
from enum import Enum
from typing import List, Union
class ApplicableSizesType(Enum):
SMALL_MEDIUM_LARGE = "small medium large"
VALUE_2_4_6_8_10_12_14_16_18 = "2 4 6 8 10 12 14 16 18"
class SizeTypeValue(Enum):
SMALL = "small"
MEDIUM = "medium"
LARGE = "large"
class SmallSizeType(Enum):
VALUE_2 = 2
VALUE_4 = 4
VALUE_6 = 6
SMALL = "small"
@dataclass
class SizesType:
size: List[Union[int, SizeTypeValue]] = field(
default_factory=list,
metadata={
"type": "Element",
"namespace": "",
"min_inclusive": 2,
"max_inclusive": 18,
}
)
small_size: List[SmallSizeType] = field(
default_factory=list,
metadata={
"name": "smallSize",
"type": "Element",
"namespace": "",
}
)
international_size: List[Union[int, SizeTypeValue]] = field(
default_factory=list,
metadata={
"name": "internationalSize",
"type": "Element",
"namespace": "",
"min_inclusive": 24,
"max_inclusive": 54,
}
)
available_sizes: List[List[Union[int, SizeTypeValue]]] = field(
default_factory=list,
metadata={
"name": "availableSizes",
"type": "Element",
"namespace": "",
"min_inclusive": 2,
"max_inclusive": 18,
"tokens": True,
}
)
applicable_sizes: List[ApplicableSizesType] = field(
default_factory=list,
metadata={
"name": "applicableSizes",
"type": "Element",
"namespace": "",
}
)
@dataclass
class Sizes(SizesType):
class Meta:
name = "sizes"
Data Binding
<sizes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chapter11.xsd">
<size>12</size>
<size>medium</size>
<smallSize>6</smallSize>
<smallSize>small</smallSize>
<internationalSize>12</internationalSize>
<internationalSize>24</internationalSize>
<internationalSize>large</internationalSize>
<availableSizes>10 large 2</availableSizes>
<applicableSizes>small medium large</applicableSizes>
</sizes>
<sizes>
<size>12</size>
<size>medium</size>
<smallSize>6</smallSize>
<smallSize>small</smallSize>
<internationalSize>12</internationalSize>
<internationalSize>24</internationalSize>
<internationalSize>large</internationalSize>
<availableSizes>10 large 2</availableSizes>
<applicableSizes>small medium large</applicableSizes>
</sizes>
{
"size": [
12,
"medium"
],
"smallSize": [
6,
"small"
],
"internationalSize": [
12,
24,
"large"
],
"availableSizes": [
[
10,
"large",
2
]
],
"applicableSizes": [
"small medium large"
]
}
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR