Подтвердить что ты не робот

Проверка 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.

Большое спасибо за помощь!

4b9b3361

Ответ 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>