xml - how can i remove the ordering from a xsd sequence -
how can remove ordering restriction in following xsd:
<xs:element name="example"> <xs:sequence> <xs:element name="hostname" type="xs:string" minoccurs="0" maxoccurs="1"/> <xs:element name="filename" type="xs:string" minoccurs="1" maxoccurs="1"/> <xs:element name="chunks" type="xs:string" minoccurs="1" maxoccurs="unbonded"/> </xs:sequence> </xs:element> so @ end following xml should validated
<example> <chunks>...</chunks> <filename>...</filename> <chunks>...</chunks> </example> <!-- --> <example> <filename>...</filename> <chunks>...</chunks> <chunks>...</chunks> </example> <!-- --> <example> <filename>...</filename> <chunks>...</chunks> <chunks>...</chunks> <hostname>...</hostname> </example> accepted solution:
<xs:element name="example"> <xs:all> <xs:element name="hostname" type="xs:string" minoccurs="0" maxoccurs="1"/> <xs:element name="filename" type="xs:string" minoccurs="1" maxoccurs="1"/> <xs:element name="chunks" type="xs:string" minoccurs="1" maxoccurs="unbonded"/> </xs:all> </xs:element>
you can achieve combination of sequence , choice repeating elements in several possible combinations, guarantee required ones present, won't nice , simple. suggest different design (if possible).
is there reason <chunks> elements can appear anywhere? if designing xml, deciding upon restrictions necessary , ones should made flexible simplify generation , processing (as validation). keeping them in sequence or wrapping them allow them seen group , make validation easier (it simplify language mapping, example, wrapped identical elements mapped array).
one form of keeping similar elements sequence, don't want. wrap in type , use xs:all:
<xs:element name="example"> <xs:complextype> <xs:all> <xs:element name="filename" type="xs:string" minoccurs="1" maxoccurs="1"/> <xs:element name="hostname" type="xs:string" minoccurs="0" maxoccurs="1"/> <xs:element name="chunks" type="chunkstype" minoccurs="1" maxoccurs="1"/> </xs:all> </xs:complextype> </xs:element> <xs:complextype name="chunkstype"> <xs:sequence> <xs:element name="chunk" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> this validate xml fragment this:
<example> <chunks> <chunk>...</chunk> <chunk>...</chunk> </chunks> <filename>...</filename> </example> <!-- --> <example> <filename>...</filename> <chunks> <chunk>...</chunk> <chunk>...</chunk> </chunks> </example> <!-- --> <example> <filename>...</filename> <chunks> <chunk>...</chunk> </chunks> <hostname>...</hostname> </example> <example> <hostname>...</hostname> <filename>...</filename> <chunks> <chunk>...</chunk> <chunk>...</chunk> </chunks> </example> and fail these:
<!-- missing filename --> <example> <chunks> <chunk>...</chunk> <chunk>...</chunk> </chunks> </example> <!-- no chunks block --> <example> <filename>...</filename> <hostname>...</hostname> </example> <!-- empty chunks block --> <example> <hostname>...</hostname> <filename>...</filename> <chunks></chunks> </example> you can't place unbounded element in xs:all since allows 0 or 1. can't use sequence of choices because have required elements. , can't combine xs:all sequence solve problem (actually can of these things, if using xsd 1.1).
in xsd 1.1 can have xs:all unbounded elements validate xml using:
<xs:all> <xs:element name="filename" type="xs:string" minoccurs="1" maxoccurs="1"/> <xs:element name="hostname" type="xs:string" minoccurs="0" maxoccurs="1"/> <xs:element name="chunks" type="xs:string" minoccurs="1" maxoccurs="unbounded"/> </xs:all> which illegal in xsd 1.0.
Comments
Post a Comment