Схема XML - как вам условно требовать элементы адреса? (улица, город, штат и т. д.) - PullRequest
3 голосов
/ 06 июня 2010

Если адрес может состоять из дочерних элементов: улица, город, штат, почтовый индекс ... как разрешить этот XML:

 <Address>
         <Street>Somestreet</Street> 
         <PostalCode>zip</PostalCode>                     
 </Address>

и разрешить это:

<Address>
     <City>San Jose</City>
     <Street>Somestreet</Street> 
     <State>CA</State>
</Address>

но не это:

<Address>
    <Street>Somestreet</Street> 
    <City>San Jose</City>
</Address>

Какая схема будет делать такие вещи??

1 Ответ

6 голосов
/ 06 июня 2010

Существует запутанный способ использования choice для создания вариантов, в которых разрешены только допустимые комбинации ...

В вашем примере это должно иметь желаемый результат:

 <xs:complexType name="Address">
  <xs:choice>
   <xs:sequence>
    <xs:element name="city"/>
    <xs:element name="street"/>
    <xs:element name="state"/>
   </xs:sequence>
   <xs:sequence>
    <xs:element name="street"/>
    <xs:element name="postcode"/>
   </xs:sequence>
  </xs:choice>
 </xs:complexType>

Другойпростой пример, если вы хотите разрешить любые два из трех ... вы можете сделать это, скажем, у вас есть элементы ABC, и вы хотите разрешить любые два из трех, вы можете использовать следующее xsd:

<xs:complexType name="anyTwo">
  <xs:choice>
   <xs:sequence>
    <xs:element name="A"/>
    <xs:element name="B"/>
   </xs:sequence>
   <xs:sequence>
    <xs:element name="A"/>
    <xs:element name="C"/>
   </xs:sequence>
   <xs:sequence>
    <xs:element name="B"/>
    <xs:element name="C"/>
   </xs:sequence>
  </xs:choice>
 </xs:complexType>

Вы можетевидите, что это скоро станет громоздким для больших наборов, но принципал работает!

Редактировать: см. также ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...