Как вы можете создать последовательность необязательных элементов, которые должны быть в порядке в схеме XML? - PullRequest
5 голосов
/ 31 мая 2009

Что я хочу сделать, это создать элемент последовательности в XML-схеме так, чтобы содержимое было в порядке, но не все присутствовали. Например, схема будет выглядеть примерно так:

<xs:element name="rods" maxOccurs="1" minOccurs="1">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="green" type="xs:positiveInteger" />
   <xs:element name="white" type="xs:positiveInteger" />
   <xs:element name="blue" type="xs:positiveInteger" />
   <xs:element name="yellow" type="xs:positiveInteger" />
   <xs:element name="red" type="xs:positiveInteger" />
   <xs:element name="tan" type="xs:positiveInteger" />
   <xs:element name="gray" type="xs:positiveInteger" />
   <xs:element name="black" type="xs:positiveInteger" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

и разрешил бы XML следующим образом:

<rods>
 <green>142</green>
 <white>34</white>
 <gray>65</gray>
</rods>

MSDN может сказать об этом:

В следующем примере показан элемент (zooAnimals), который может содержать ноль или более следующих элементов, elephant, bear, giraffe, в элементе sequence.

<xs:element name="zooAnimals">
      <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
               <xs:element name="elephant"/>
               <xs:element name="bear"/>
               <xs:element name="giraffe"/>
            </xs:sequence>
      </xs:complexType>
</xs:element>

W3Schools предлагает то же самое. Однако и Visual Studio, и онлайн-сервису валидации не нравится то, что предлагается.

Вот что у меня есть на данный момент:

<xs:element name="rods" maxOccurs="1" minOccurs="1">
 <xs:complexType>
  <xs:sequence minOccurs="0" maxOccurs="1">
   <xs:element name="green" type="xs:positiveInteger" />
   <xs:element name="white" type="xs:positiveInteger" />
   <xs:element name="blue" type="xs:positiveInteger" />
   <xs:element name="yellow" type="xs:positiveInteger" />
   <xs:element name="red" type="xs:positiveInteger" />
   <xs:element name="tan" type="xs:positiveInteger" />
   <xs:element name="gray" type="xs:positiveInteger" />
   <xs:element name="black" type="xs:positiveInteger" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

А вот и XML:

<rods>
 <green>142</green>
 <white>34</white>
 <gray>65</gray>
</rods>

Visual Studio 2005 утверждает, что "серый" недопустим, "синий" ожидается, поэтому он явно хочет, чтобы все дети

Спасибо

Эрик

1 Ответ

10 голосов
/ 31 мая 2009
<xs:element name="rods">
    <xs:complexType>
        <xs:sequence>
                <xs:element minOccurs="0" name="green" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="white" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="blue" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="yellow" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="red" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="tan" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="gray" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="black" type="xs:positiveInteger" />
        </xs:sequence>
    </xs:complexType>
</xs:element>
...