Chapter 02¶
A quick tour of XML Schema¶
Example 2-2 Product schema¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="product" type="ProductType" />
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer" />
<xs:element name="size" type="SizeType" />
</xs:sequence>
<xs:attribute name="effDate" type="xs:date" />
</xs:complexType>
<xs:simpleType name="SizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProductType:
"""
:ivar number:
:ivar size:
:ivar eff_date:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
size: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True,
min_inclusive=2.0,
max_inclusive=18.0
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
@dataclass
class Product(ProductType):
class Meta:
name = "product"
Example 2-6 Anonymous type¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Size:
"""
:ivar value:
"""
class Meta:
name = "size"
value: Optional[int] = field(
default=None,
metadata=dict(
min_inclusive=2.0,
max_inclusive=18.0
)
)
Example 2-8 More complicated content model¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer" />
<xs:choice minOccurs="0" maxOccurs="3">
<xs:element name="size" type="xs:int" />
<xs:element name="color" type="xs:string" />
</xs:choice>
<xs:any namespace="##other" />
</xs:sequence>
<xs:attribute name="effDate" type="xs:date" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import List, Optional
@dataclass
class ProductType:
"""
:ivar number:
:ivar size:
:ivar color:
:ivar other_element:
:ivar eff_date:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
size: List[int] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=3
)
)
color: List[str] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=3
)
)
other_element: Optional[object] = field(
default=None,
metadata=dict(
type="Wildcard",
namespace="##other",
required=True
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
Example 2-9 Complex type extension¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ShirtType">
<xs:complexContent>
<xs:extension base="ProductType">
<xs:sequence>
<xs:element name="color" type="xs:string" />
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="size" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProductType:
"""
:ivar number:
:ivar name:
:ivar size:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
name: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
size: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
@dataclass
class ShirtType(ProductType):
"""
:ivar color:
:ivar id:
"""
color: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
id: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute",
required=True
)
)
Example 2-10 Product schema document with target namespace¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://datypic.com/prod" xmlns:prod="http://datypic.com/prod">
<xs:element name="product" type="prod:ProductType" />
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer" />
<xs:element name="size" type="prod:SizeType" />
</xs:sequence>
<xs:attribute name="effDate" type="xs:date" />
</xs:complexType>
<xs:simpleType name="SizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
__NAMESPACE__ = "http://datypic.com/prod"
@dataclass
class ProductType:
"""
:ivar number:
:ivar size:
:ivar eff_date:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
size: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True,
min_inclusive=2.0,
max_inclusive=18.0
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
@dataclass
class Product(ProductType):
class Meta:
name = "product"
namespace = "http://datypic.com/prod"
Example 2-14 Annotation¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:doc="http://datypic.com/doc">
<xs:element name="product" type="ProductType">
<xs:annotation>
<xs:documentation xml:lang="en" source="http://datypic.com/prod.html#product">
<doc:description>This element represents a product.</doc:description>
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="size" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProductType:
"""
:ivar number:
:ivar name:
:ivar size:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
name: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
size: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
@dataclass
class Product(ProductType):
"""<doc:description>This element represents a product.</doc:description>"""
class Meta:
name = "product"
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR