Проверка XML с помощью XSD: как избежать заботы о последовательности элементов? - PullRequest
37 голосов
/ 24 июля 2010

У меня следующий 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>

Проблема здесь в следующем: расположение элементов, множественный вывод и т. Д. Должны отображаться в том же порядке, в котором они были объявлены.Я не хочу, чтобы это произошло, я хочу, чтобы в процессе валидации последовательность не была релевантной.Как мне достичь этого?

Еще одна возможность, которую я попробовал, была:

<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.

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

Ответы [ 3 ]

47 голосов
/ 24 июля 2010
<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: any.

<xsd:complexType name="questions">
    <xsd:sequence>
        <xsd:any minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

Подробную информацию о xsd: any можно найти по следующей ссылке:

https://www.w3schools.com/xml/schema_complex_any.asp

19 голосов
/ 23 декабря 2011

Я немного опоздал к этому обсуждению, но у меня возникла та же проблема, и я нашел решение:

<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: any будет работать, это не ограничит ваш выбор четырьмя элементами, перечисленными в списке.Это позволит все, что в значительной степени противоречит цели схемы.

1 голос
/ 26 мая 2015

Также очень поздно для вечеринки здесь, но будет ли использование <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>
...