Problemas para definir una lista de elementos en un archivo XSD cuando se repiten elementos
-
27-10-2019 - |
Pregunta
Estoy tratando de escribir un archivo XSD para validar mi XML. Aquí hay una muestra del 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>
Y aquí está el XSD que lo define
<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>
Mi problema es sequence
no me permite poner entradas de relleno donde quiera (en este momento puedo tener tantos RecordEntry
entradas como quiera seguidas de tantos Padding
entradas como quiera).
Mi pensamiento inital era usar all
en lugar de secuencia. Sin embargo, no me dejará usar all
con maxOccurs
¿Qué debo hacer para definir mi lista correctamente?
Editar: Freek lo tenía bien, esto es a lo que tuve que cambiarlo para que funcione.
<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>
Solución
También puede establecer Minoccurs y Maxoccurs en la secuencia XS: estableciéndolo en valores apropiados (probablemente Minoccurs = "0" Maxoccurs = "ilimitado") debería resolver su problema.