Проблемы с определением списка элементов в файле XSD, когда элементы повторяют
-
27-10-2019 - |
Вопрос
Я пытаюсь написать файл XSD, чтобы проверить мой XML. Вот образец 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>
И вот XSD, который определяет это
<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>
Моя проблема в том sequence
не позволяет мне положить записи, где бы я ни захочу (прямо сейчас я могу иметь столько же RecordEntry
Записи, как я хочу, следовало столько же Padding
записи, как я хочу).
Моей инитальной мыслью было использовать all
вместо последовательности. Однако это не позволит мне использовать all
с maxOccurs
Что мне нужно сделать, чтобы правильно определить мой список?
РЕДАКТИРОВАТЬ: Freek сделал это правильно, вот что я должен был изменить, чтобы заставить его работать.
<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>
Решение
Вы также можете установить Minoccurs и Maxoccurs на xs: последовательность, устанавливая это на соответствующие значения (вероятно, minoccurs = "0" maxoccurs = "неограниченное") должны решить вашу проблему.