What is the difference between <all> <sequence> <choice> and <group>
in XML Schema?
The difference between <all> <sequence> <choice> and <group> in XSD?
Asked Answered
When to use xsd:all
, xsd:sequence
, xsd:choice
, or xsd:group
:
- Use
xsd:all
when all child elements must be present, independent of order. - Use
xsd:sequence
when child elements must be present per their occurrence constraints and order does matters. - Use
xsd:choice
when one of the child element must be present. - Use
xsd:group
as a way to wrap any of the above in order to name and reuse in multiple locations within an XSD.
Note that occurrence constraints can appear on xsd:all
, xsd:sequence
, or xsd:choice
in addition to the child elements to achieve various cardinality effects.
For example, if minOccurs="0"
were added to xsd:element
children of xsd:all
, element order would be insignificant, but not all child elements would have to be present:
<?xml version="1.0"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="r">
<xsd:complexType>
<xsd:all>
<xsd:element name="a" type="xsd:string" minOccurs="0"/>
<xsd:element name="b" type="xsd:string" minOccurs="0"/>
<xsd:element name="c" type="xsd:string" minOccurs="0"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
For the above XSD, the following XML would be valid, even though not all children of r
are present:
<r>
<b/>
<a/>
</r>
See also
I want to use xsd:all since I don't want to maintain the sequence, but it requires all child elements to be present. I do not want this constraint too. Any way for this? –
Larcener
@HrishikeshBawane: Add
minOccurs="0"
to those xsd:element
children of xsd:all
that you wish to be optional. I've updated the answer with an example showing how. –
Lenitalenitive © 2022 - 2024 — McMap. All rights reserved.