XSD - как позволить элементы в порядке какое-либо количество раз?

Я пытаюсь создать XSD, и пытающийся записать определение со следующим требованием:

  • Позвольте дочерний элемент, указанный для появления любого количества раз (0 к неограниченному)
  • Позвольте дочерним элементам быть в любом порядке

Я озирался и нашел различные решения как это:


  
    
      
      
    
  

Но от того, что я понимаю, xs:choice все еще только позволяет единственный выбор элемента. Установка Hence MaxOccurs к неограниченному как это должен только подразумевать, что "любой" из дочерних элементов может появиться многократно. Действительно ли это точно?

Если выше решения является неправильным, как я могу достигнуть что я вышеизложенный в моем требовании?

Править: Что, если требование следующим образом?

  • Элемент child1 child2 может появиться любое количество раз (0 к неограниченному)
  • Элементы, чтобы быть в любом порядке
  • Элементы child3 и child4 должны появиться точно однажды.

Например, этот xml допустим:


 value 
 value 
 value 
 value 
 value 
 value 

но это не (отсутствующий child3)


 value 
 value 
 value 
 value 
 value 

102
задан Nik Reiman 25 January 2019 в 18:09
поделиться

3 ответа

В схеме, указанной в вашем вопросе, 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>
57
ответ дан 24 November 2019 в 04:29
поделиться

Но, насколько я понимаю, xs:choice по-прежнему позволяет выбирать только один элемент. Следовательно, установка MaxOccurs в unbounded таким образом должна означать, что "любой" из дочерних элементов может появиться несколько раз. Верно ли это?

Нет. Выбор происходит отдельно для каждого "повторения" xs:choice, которое происходит из-за maxOccurs="unbounded". Таким образом, код, который вы опубликовали, является правильным, и будет действительно делать то, что вы хотите, как написано.

8
ответ дан 24 November 2019 в 04:29
поделиться

Вы должны обнаружить, что следующая схема разрешает то, что вы предложили.

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

Что, похоже, соответствует вашему вопросу.

3
ответ дан 24 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: