我想要完成的是创建一个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将具有一个或另一个(Size
或AlaMode
和{{ 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
(也许)完成此操作而没有那个额外的级别。或许我在这里错过了一些东西。
是的,我意识到布局不是最好的,但它是一种现有格式,我现在可以真正改变。
答案 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>