关于xsd的问题。必须以任何顺序允许复杂类型内的元素

时间:2010-12-22 13:31:37

标签: xsd

如果您查看以下xsd片段,您可以得出结论,相应的xml将首先包含汽车,然后是公共汽车,例如:

car,car,bus,bus

但是我希望xml能够包含

car,bus,car,bus

为了实现这一目标,我需要在下面的xsd中进行哪些更改?

<xs:element name="body">
   <xs:complexType>
      <xs:sequence>
         <xs:element name="session" type="tns:session" />
         <xs:element minOccurs="0" maxOccurs="unbounded" name="car" type="tns:car" />
         <xs:element minOccurs="0" maxOccurs="unbounded" name="bus" type="tns:bus" />
      </xs:sequence>
   </xs:complexType>
</xs:element>

2 个答案:

答案 0 :(得分:0)

这有点麻烦,但你可能会达到你想要的目标:

  • 创建一个<xs:choice>元素,其中包含汽车和总线元素;这定义了可以使用其中一个包含的元素

  • 确保在minOccurs=1上设置了maxOccurs=unbounded<xs:choice> - 这可以为您提供任意数量的汽车或公交车元素 - 任意数字,任意组合

所以你的XML模式看起来像这样(我添加了一些东西只是为了能够生成一个示例XML并验证它是否有效 - 根据需要进行调整):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="body">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element minOccurs="0" maxOccurs="unbounded" name="car" type="CarType" />
            <xs:element minOccurs="0" maxOccurs="unbounded" name="bus" type="BusType" />
        </xs:choice>
      </xs:complexType>
    </xs:element>
    <xs:complexType name="CarType">
        <xs:sequence>
            <xs:element name="Maker" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BusType">
        <xs:sequence>
            <xs:element name="Maker" type="xs:string" />
            <xs:element name="Capacity" type="xs:int" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

答案 1 :(得分:-1)

使用<xs:any>代替<xs:sequence>