XML Schema - 您如何有条件地要求地址元素?(街道,城市,州等)

3 xml xsd

如果一个地址可以由子元素组成:Street,City,State,PostalCode ......你如何允许这个XML:

 <Address>
         <Street>Somestreet</Street> 
         <PostalCode>zip</PostalCode>                     
 </Address>
Run Code Online (Sandbox Code Playgroud)

并允许这个:

<Address>
     <City>San Jose</City>
     <Street>Somestreet</Street> 
     <State>CA</State>
</Address>
Run Code Online (Sandbox Code Playgroud)

不是这个:

<Address>
    <Street>Somestreet</Street> 
    <City>San Jose</City>
</Address>
Run Code Online (Sandbox Code Playgroud)

什么架构会做这样的事情!?

Dog*_*ars 6

有一种复杂的方式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>
Run Code Online (Sandbox Code Playgroud)

另一个简单的例子,如果你想允许三个中的任何两个..你可以这样做,说你有元素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>
Run Code Online (Sandbox Code Playgroud)

你可以看到,对于大型套装来说,这很快就会变得笨重,但校长确实有效!

编辑:也参见这个答案