没有嵌套的XML选择

时间:2013-06-03 14:03:27

标签: xml xsd

我想要完成的是创建一个XML模式,它描述了一个XML文件,它可以采用两种形式之一。两者之间有一段共同的元素,然后是一个不同的小部分。类似的东西:

<Dessert>
  <Identifier> Hot Fudge Sundae </Identifier>
  <SaleDate> 2013-06-03 </SaleDate>
  <Duration> 2 </Duration>
  <Size> SuperScooper </Size>
</Dessert>

<Dessert>
  <Identifier> Dutch Apple Pie </Identifier>
  <SaleDate> 2013-06-03 </SaleDate>
  <Duration> 1 </Duration>
  <AlaMode> 1 </AlaMode>
  <IceCreamFlavor> Vanilla </IceCreamFlavor>
</Dessert>

因此,对于冰淇淋甜点,只有大小,而馅饼则有 AlaMode 指示符和 IceCreamFlavor 说明符。

我想要完成的是使用xs:choice说明符来表明Dessert XML将具有一个或另一个(SizeAlaMode和{{ 1}})以便我可以验证它们。

我尝试做的是创建两种类型并执行以下操作:

          

               

然后执行以下操作:

IceCreamFlavor

但是生成的XML当然有这样的布局:

<xs:choice>
  <xs:element name="Sundae" type="SundaeType" />
  <xs:element name="Pie" type="PieType" />
</xs:choice>

与现有文件结构不匹配。

我可以简单地组合所有可能的元素并取消<Dessert> <Identifier> Hot Fudge Sundae </Identifier> <SaleDate> 2013-06-03 </SaleDate> <Duration> 2 </Duration> <Sundae> <Size> SuperScooper </Size> <Sundae> </Dessert> 的东西,但这实际上并没有表达对格式的期望(例如,它对于圣代无效)有一个xs:choice元素。)

有没有办法实现这个目标?我怀疑如果我只有一个字段不同,我可以使用AlaMode(也许)完成此操作而没有那个额外的级别。或许我在这里错过了一些东西。

是的,我意识到布局不是最好的,但它是一种现有格式,我现在可以真正改变。

1 个答案:

答案 0 :(得分:2)

如果您不介意对源文档中的元素强制执行订单,则可以使用xs:sequence:

<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="Dessert">
        <xs:sequence>
            <xs:element name="Identifier" type="xs:string"/>
            <xs:element name="SaleDate" type="xs:int"/>
            <xs:element name="Duration" type="xs:int"/>
            <xs:choice>
                <xs:element name="Size" type="xs:string"/>
                <xs:sequence>
                    <xs:element name="AlaMode" type="xs:int"/>
                    <xs:element name="IceCreamFlavor" type="xs:string"/>
                </xs:sequence>
            </xs:choice>

        </xs:sequence>
    </xs:complexType>

    <xs:element name="Dessert" type="Dessert"/>
</xs:schema>