Я пытаюсь создать XSD, и пытающийся записать определение со следующим требованием:
Я озирался и нашел различные решения как это:
Но от того, что я понимаю, xs:choice все еще только позволяет единственный выбор элемента. Установка Hence MaxOccurs к неограниченному как это должен только подразумевать, что "любой" из дочерних элементов может появиться многократно. Действительно ли это точно?
Если выше решения является неправильным, как я могу достигнуть что я вышеизложенный в моем требовании?
Править: Что, если требование следующим образом?
Например, этот xml допустим:
value
value
value
value
value
value
но это не (отсутствующий child3)
value
value
value
value
value
В схеме, указанной в вашем вопросе, child1
или child2
могут появляться в любом порядке, любое число. раз. Это похоже на то, что вы ищете.
Редактировать: если вы хотите, чтобы только один из них появлялся неограниченное количество раз, неограниченное должно было бы перейти к элементам:
Редактировать: Фиксированный тип в XML.
Редактировать: Заглавная O в maxOccurs
<xs:element name="foo">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
<xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
Но, насколько я понимаю, xs:choice по-прежнему позволяет выбирать только один элемент. Следовательно, установка MaxOccurs в unbounded таким образом должна означать, что "любой" из дочерних элементов может появиться несколько раз. Верно ли это?
Нет. Выбор происходит отдельно для каждого "повторения" xs:choice
, которое происходит из-за maxOccurs="unbounded"
. Таким образом, код, который вы опубликовали, является правильным, и будет действительно делать то, что вы хотите, как написано.
Вы должны обнаружить, что следующая схема разрешает то, что вы предложили.
<xs:element name="foo">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element maxOccurs="unbounded" name="child1" type="xs:unsignedByte" />
<xs:element maxOccurs="unbounded" name="child2" type="xs:string" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
Это позволит вам создайте файл, например:
<?xml version="1.0" encoding="utf-8" ?>
<foo>
<child1>2</child1>
<child1>3</child1>
<child2>test</child2>
<child2>another-test</child2>
</foo>
Что, похоже, соответствует вашему вопросу.