различные коллекции дочерних элементов - PullRequest
1 голос
/ 17 января 2011

возможно ли создать схему, в которой дочерние элементы элемента будут частично в последовательности, а частично - нет? как то так:

<xs:element name="rootElement">
 <xs:complexType>
  <xs:all>
   <xs:element name="value1" type="xs:string"/>
   <xs:element name="value2" type="xs:string"/>
  </xs:all>
  <xs:sequence>
   <xs:element name="value3" type="xs:string"/>
   <xs:element name="value4" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

Заранее спасибо!

1 Ответ

0 голосов
/ 19 января 2011

OK.Я думаю, я понимаю, вы знаете.Ваш XML выглядит так:

<?xml version="1.0"?>
<house> 
    <ownerName>aaa</ownerName>
    <ownerLastName>bbb</ownerLastName>
    <rooms>
        <room1>kitchen</room1>
        <room2>living room</room2>
        <room3></room3>
        <room4></room4> 
        <room5></room5>
    </rooms>
</house>

Вы хотите, чтобы элементы ownerName и ownerLastName встречались в любом порядке, хотя они оба должны присутствовать.Из вашего описания не ясно, насколько важна позиция элемента rooms.Я предположил, что это так.Импортируется, что дочерние элементы rooms остаются в порядке.

Разбивая это, мы можем определить complexType для комнат (поэтому модель завершена)

<xs:complexType name="RoomType">
    <xs:simpleContent>
        <xs:extension base="xs:string"/>
    </xs:simpleContent>
</xs:complexType>

<xs:element name="RoomsType">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="room1" type="RoomType"/>
            <xs:element name="room2" type="RoomType"/>
            <xs:element name="room3" type="RoomType"/>
            <xs:element name="room4" type="RoomType"/>
            <xs:element name="room5" type="RoomType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Этодает нам последовательность номеров по порядку.

Существует довольно много ограничений на использование xs:all, поэтому я избежал этого здесь (вы не можете использовать в последовательности, например).Чтобы имена владельцев появлялись в любом порядке, я выбрал две последовательности.Выбор встроен в другую последовательность, чтобы гарантировать, что элемент rooms будет последним.

<xs:complexType name="HouseType">
    <xs:sequence>
        <xs:choice>
            <xs:sequence>
                <xs:element ref="ownerName"/>
                <xs:element ref="ownerLastName"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element ref="ownerLastName"/>
                <xs:element ref="ownerName"/>
            </xs:sequence>
        </xs:choice>
        <xs:element name="rooms" type="HouseType"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="house" type="HouseType"/>

Теперь, если вы на самом деле не заботитесь о заказе или ownerLastName, ownerName и house, тогда вы можете без проблем использовать xs:all:

<xs:complexType name="HouseType">
    <xs:all>
        <xs:element ref="ownerName"/>
        <xs:element ref="ownerLastName"/>
        <xs:element name="rooms" type="HouseType"/>
    </xs:all>
</xs:complexType>

, что требует наличия всех трех элементов в любом порядке.

...