#17 - Identity constraintsΒΆ
Schema
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation>
This example illustrates identity constraints. Each child of items must have a number attribute whose value is unique within order. All product descendents of order must have a number child whose value matches one of these unique product numbers.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="order" type="OrderType">
<xsd:keyref name="prodNumKeyRef" refer="prodNumKey">
<xsd:selector xpath="items/*"/>
<xsd:field xpath="@number"/>
</xsd:keyref>
<xsd:key name="prodNumKey">
<xsd:selector xpath=".//product"/>
<xsd:field xpath="number"/>
</xsd:key>
</xsd:element>
<xsd:complexType name="OrderType">
<xsd:sequence>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="items" type="ItemsType"/>
<xsd:element name="products" type="ProductsType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ItemsType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="shirt" type="ProductOrderType"/>
<xsd:element name="hat" type="ProductOrderType"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="ProductOrderType">
<xsd:sequence>
<xsd:element name="quantity" type="xsd:integer"/>
<xsd:element name="color" type="ColorType" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="number" type="xsd:integer"/>
</xsd:complexType>
<xsd:complexType name="ProductsType">
<xsd:sequence>
<xsd:element name="product" type="ProductType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ProductType">
<xsd:sequence>
<xsd:element name="number" type="xsd:integer"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="price" type="PriceType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ColorType">
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="PriceType">
<xsd:simpleContent>
<xsd:extension base="xsd:decimal">
<xsd:attribute name="currency" type="xsd:token"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
Models
from dataclasses import dataclass, field
from decimal import Decimal
from typing import List, Optional
@dataclass
class ColorType:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata={
"type": "Attribute",
}
)
@dataclass
class PriceType:
"""
:ivar value:
:ivar currency:
"""
value: Optional[Decimal] = field(
default=None,
)
currency: Optional[str] = field(
default=None,
metadata={
"type": "Attribute",
}
)
@dataclass
class ProductOrderType:
"""
:ivar quantity:
:ivar color:
:ivar number:
"""
quantity: Optional[int] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
color: Optional[ColorType] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
}
)
number: Optional[int] = field(
default=None,
metadata={
"type": "Attribute",
}
)
@dataclass
class ProductType:
"""
:ivar number:
:ivar name:
:ivar price:
"""
number: Optional[int] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
name: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
price: Optional[PriceType] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
@dataclass
class ItemsType:
"""
:ivar shirt_or_hat:
"""
shirt_or_hat: List[object] = field(
default_factory=list,
metadata={
"type": "Elements",
"choices": (
{
"name": "shirt",
"type": ProductOrderType,
"namespace": "",
},
{
"name": "hat",
"type": ProductOrderType,
"namespace": "",
},
),
}
)
@dataclass
class ProductsType:
"""
:ivar product:
"""
product: List[ProductType] = field(
default_factory=list,
metadata={
"type": "Element",
"namespace": "",
"min_occurs": 1,
}
)
@dataclass
class OrderType:
"""
:ivar number:
:ivar items:
:ivar products:
"""
number: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
items: Optional[ItemsType] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
products: Optional[ProductsType] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
"required": True,
}
)
@dataclass
class Order(OrderType):
class Meta:
name = "order"
XML Document
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chapter17.xsd">
<number>123ABBCC123</number>
<items>
<shirt number="557">
<quantity>1</quantity>
<color value="blue"/>
</shirt>
<shirt number="557">
<quantity>1</quantity>
<color value="sage"/>
</shirt>
<hat number="563">
<quantity>1</quantity>
</hat>
</items>
<products>
<product>
<number>557</number>
<name>Short-Sleeved Linen Blouse</name>
<price currency="USD">29.99</price>
</product>
<product>
<number>563</number>
<name>Ten-Gallon Hat</name>
<price currency="USD">69.99</price>
</product>
</products>
</order>
xsData XML Document
<order>
<number>123ABBCC123</number>
<items>
<shirt number="557">
<quantity>1</quantity>
<color value="blue"/>
</shirt>
<shirt number="557">
<quantity>1</quantity>
<color value="sage"/>
</shirt>
<hat number="563">
<quantity>1</quantity>
</hat>
</items>
<products>
<product>
<number>557</number>
<name>Short-Sleeved Linen Blouse</name>
<price currency="USD">29.99</price>
</product>
<product>
<number>563</number>
<name>Ten-Gallon Hat</name>
<price currency="USD">69.99</price>
</product>
</products>
</order>
xsData JSON
{
"number": "123ABBCC123",
"items": {
"shirt_or_hat": [
{
"quantity": 1,
"color": {
"value": "blue"
},
"number": 557
},
{
"quantity": 1,
"color": {
"value": "sage"
},
"number": 557
},
{
"qname": "hat",
"value": {
"quantity": 1,
"color": null,
"number": 563
}
}
]
},
"products": {
"product": [
{
"number": 557,
"name": "Short-Sleeved Linen Blouse",
"price": {
"value": "29.99",
"currency": "USD"
}
},
{
"number": 563,
"name": "Ten-Gallon Hat",
"price": {
"value": "69.99",
"currency": "USD"
}
}
]
}
}
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR