Проверка XML с помощью XSD: как избежать заботы о последовательности элементов?
У меня следующий код XSD:
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
Проблема здесь: расположение элементов, multipleChoiceInput и т.д. должны появляться в том же порядке, в котором они объявлены. Я не хочу, чтобы это произошло, я хочу, чтобы в процессе проверки последовательность не была релевантной. Как я могу достичь этого?
Другая возможность, которую я пробовал, была:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
В этом примере последовательность действительно не имеет значения, и у меня может быть столько элементов, сколько я хочу (что "все" не позволит мне делать). Но у меня все еще есть проблема с min- и maxOccurs. В этом примере у меня могло бы быть так много "pictureInput" как возможно, что опять-таки ограничение, которое я хотел бы иметь либо 0, либо 1.
Большое спасибо за помощь!
Ответы
Ответ 1
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:all>
</xsd:complexType>
ПРИМЕЧАНИЕ. Я изменил "последовательность" на "все"
Порядок последовательности последовательности (как определено). если порядок не имеет значения, тогда используется все.
Если есть вероятность появления элемента более одного раза, тогда xsd: любой может быть использован.
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:any minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
Вы можете найти информацию о xsd: любой по следующей ссылке:
http://www.w3schools.com/schema/schema_complex_any.asp
Ответ 2
Я немного опоздал на это обсуждение, но у меня была та же проблема и нашла решение:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:choice>
</xsd:complexType>
Ключ состоит в объединении xs: choice с maxOccurs = "unbounded". Если вы просто используете xs: all, вам разрешен один из каждого периода.
отредактирован для добавления:
В то время как xs: любой будет работать, он не будет ограничивать ваш выбор четырьмя элементами, указанными в таблице. Это позволит что угодно, что в значительной степени нарушает цель схемы.
Ответ 3
Также очень поздно для вечеринки здесь, но использовать <xsd:all>
в сочетании с minOccurs
и maxOccurs
не работает?:
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>