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

时间:2010-06-05 21:59:55

标签: xml xsd

如果地址可以由子元素组成:Street,City,State,PostalCode ...您如何允许此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 个答案:

答案 0 :(得分: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>

另一个简单的例子,如果你想允许三个中的任何两个..你可以这样做,比如你有元素A B C并且你想允许三个中的任何两个你可以使用以下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>

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

修改:另请参阅此answer