1

我想要完成的是创建一个 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符来指示DessertXML 将有一个或另一个(SizeAlaModeIceCreamFlavor),以便我可以验证它们。

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

然后执行以下操作:

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

当然,生成的 XML 具有如下布局:

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

这与现有的文件结构不匹配。

我可以简单地合并所有可能的元素并取消这些东西,但这实际上并没有传达格式的期望(例如,圣代有一个元素xs:choice是无效的)。AlaMode

有没有办法做到这一点?我怀疑如果我只有一个不同的领域,我可以用xs:choice(也许)来完成这一点,而没有那个额外的水平。或者,也许我只是在这里遗漏了一些东西。

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

4

1 回答 1

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>
于 2013-06-03T15:03:51.470 回答