XSD:嵌套类型 vs 全局类型

7

在定义XSD时,您可以选择将类型定义为嵌套类型或全局类型(complexType)。

我了解到,当涉及到形态变化或元素重用时,全局类型更加有用。

然而,如果您有一个大型数据模型,您将不得不为每个级别定义一个全局复杂类型,然后创建引用全局类型的元素。

嵌套

<xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="firstname"/>
                            <xs:element name="lastname"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="address">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="street"/>
                            <xs:element name="city"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>

全局

<xs:element name="person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="name" type="nameType"/>
            <xs:element name="address" type="addressType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="nameType">
    <xs:sequence>
        <xs:element name="firstname"/>
        <xs:element name="lastname"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="addressType">
    <xs:sequence>
        <xs:element name="street"/>
        <xs:element name="city"/>
    </xs:sequence>
</xs:complexType>

因此,我的问题是:何时使用嵌套类型而不是使它们全局?
对于任何有兴趣的人:我的问题与这个问题(XML属性 vs元素)有些相关。
1个回答

8
在给出的示例中,两者之间没有真正的区别,也没有任何显著的优势或劣势。
然而,在更大的架构中,当选择嵌套类型和全局类型时,如果没有明确定义,事情就会变得非常混乱和难以管理。
显然,使用全局类型的原因(主要是重用,还有嵌套)往往是决定性的 - 通常我更喜欢其中一种方式。也就是说,如果你正在重用某些复杂类型但不是其他类型,请将它们全都设置为全局类型。如果您不重用任何内容,则将它们全部设置为嵌套类型。
例外情况是(这是我经常遇到的情况),如果类型的定义占据了模式的大部分复杂性,而它们的包含相对简单。在这种情况下,无论它们是否被重用,我建议将它们设置为全局类型,因为当您不必浏览庞大的complexType定义时,重新结构化/重新排序文档要容易得多。它们在理论上也更可移植。
还有一些情况,您无法使用嵌套类型实现某些文档结构 - 其中一个例子是在序列中使用两个复杂类型,可以包含每种类型的0到无限个实例,并以任何混合顺序。这在嵌套类型中是不可能的,但在引用的全局类型中则可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接