从基类型忽略扩展中的元素外观顺序

时间:2017-06-06 23:32:48

标签: xml xsd

在XSD中,我有一个从基本SaleType扩展的ReturnType。我不关心元素在xml中出现的顺序。

我可以更改XSD,但我无法改变xml的写入方式。由于某种原因,写入xml的方式不是按照XSD中定义的顺序。我可以在基本类型中但在扩展名中使顺序无关紧要。我该如何解决这个问题?

<xs:complexType name="SaleType">
    <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded"> <!--adding this ignores the order for Sale but does not enforce it to the extensions-->
            <xs:element name="ItemID" type="xs:string" />
            xs:element name="Description" type="xs:string" minOccurs="0"/>
        </xs:choice>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ReturnType">
    <xs:complexContent>
        <xs:extension base="SaleType">
            <xs:sequence>
                <xs:element name="Reason" type="xs:string" minOccurs="0"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<!--Even though Description appears before ItemID, this xml validates since Reason is at the end-->
<Return>
    <Description>Item 123</Description>
    <ItemID>123</ItemID>
    <Reason>R1</Reason>
</Return>    

<!--This xml does not validate since Reason is at the beginning-->
<Return>
    <Reason></Reason>
    <Description>Item 123</Description>
    <ItemID>123</ItemID>
</Return> 

1 个答案:

答案 0 :(得分:1)

您无法在XSD中使用 扩展名 来覆盖序列指定的订单。如果您无法直接更改基类,请参阅 override ,但请注意xs:override需要XSD 1.1。