Difficoltà a definire un elenco di elementi in un file XSD quando gli elementi si ripetono
-
27-10-2019 - |
Domanda
Sto cercando di scrivere un file XSD per convalidare il mio XML. Ecco un campione di XML
<Record xmlns="http://example.com/FixedBinaryFile.xsd" Name="Clients">
<Padding Size="5">
<RecordEntry Name="Foo1" DataType ="Char"/>
<RecordEntry Name="Foo2" DataType="AnsiString" MaxSize="8"/>
<RecordEntry Name="Foo3" DataType="AnsiString" MaxSize="25"/>
<Padding Size="2"/>
<RecordEntry Name="Foo4" DataType="Byte"/>
<Padding Size="1"/>
<RecordEntry Name="Foo5" DataType="UInt16"/>
<RecordEntry Name="Foo6" DataType="AnsiString" MaxSize="3"/>
<RecordEntry Name="Foo7" DataType="AnsiString" MaxSize ="3"/>
<Padding Size="22"/>
</Record>
Ed ecco l'XSD che lo definisce
<xs:element name="Record">
<xs:complexType>
<xs:sequence>
<xs:element name="RecordEntry" type="RecordEntry" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="Padding" type ="PaddingEntry" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use ="required"/>
</xs:complexType>
</xs:element>
Il mio problema è sequence
non mi permette di mettere le voci di imbottitura dove mai voglio (in questo momento posso averne altrettanti RecordEntry
voci che voglio seguite da altrettanti Padding
voci come voglio).
Il mio pensiero inital era di usare all
invece della sequenza. Tuttavia non mi permetterà di usare all
insieme a maxOccurs
Cosa devo fare per definire correttamente la mia lista?
EDIT: Freek ha avuto bene, ecco cosa ho dovuto cambiarlo per farlo funzionare.
<xs:element name="Record">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="Padding" type ="PaddingEntry" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="RecordEntry" type="RecordEntry" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use ="required"/>
</xs:complexType>
</xs:element>
Soluzione
È inoltre possibile impostare Minoccurs e MaxOccurs su XS: Sequence, impostandolo su valori appropriati (probabilmente MinocCurs = "0" maxocCurs = "illimitato") dovrebbe risolvere il problema.