Chapter 10¶
Union and list types¶
Binding Test¶
Schema
<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 enum import Enum
from dataclasses import dataclass, field
from typing import List, Union
class SmallSizeType(Enum):
"""
:cvar VALUE_2:
:cvar VALUE_4:
:cvar VALUE_6:
:cvar SMALL:
"""
VALUE_2 = "2"
VALUE_4 = "4"
VALUE_6 = "6"
SMALL = "small"
@dataclass
class SizesType:
"""
:ivar size:
:ivar small_size:
:ivar international_size:
:ivar available_sizes:
:ivar applicable_sizes:
"""
size: List[Union[int, "SizesType.Value"]] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807,
min_inclusive=2.0,
max_inclusive=18.0
)
)
small_size: List[SmallSizeType] = field(
default_factory=list,
metadata=dict(
name="smallSize",
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
international_size: List[Union[int, "SizesType.Value"]] = field(
default_factory=list,
metadata=dict(
name="internationalSize",
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807,
min_inclusive=24.0,
max_inclusive=54.0
)
)
available_sizes: List[Union[int, "SizesType.Value"]] = field(
default_factory=list,
metadata=dict(
name="availableSizes",
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807,
min_inclusive=2.0,
max_inclusive=18.0
)
)
applicable_sizes: List[Union[int, "SizesType.Value"]] = field(
default_factory=list,
metadata=dict(
name="applicableSizes",
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807,
min_inclusive=2.0,
max_inclusive=18.0
)
)
class Value(Enum):
"""
:cvar SMALL:
:cvar MEDIUM:
:cvar LARGE:
"""
SMALL = "small"
MEDIUM = "medium"
LARGE = "large"
@dataclass
class Sizes(SizesType):
class Meta:
name = "sizes"
XML Document
<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>
xsData XML Document
<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>
xsData JSON
{
"size": [
12,
"medium"
],
"small_size": [
"6",
"small"
],
"international_size": [
12,
24,
"large"
],
"available_sizes": [
"10 large 2"
],
"applicable_sizes": [
"small medium large"
]
}
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR