关于xml:XSD:嵌套类型与全局类型

关于xml:XSD:嵌套类型与全局类型

XSD: Nested Types vs Global Types

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

我知道,在涉及形态或元素重用时,全局类型的用途更多。

但是,如果您有一个大数据模型,则必须为每个级别定义一个全局complexType,然后创建一个引用该全局类型的元素。

巢状

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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>

全球

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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属性与元素)。


在给出的示例中,两者之间没有真正的区别-两者都没有明显的优点或缺点。

但是,在较大的模式中,如果未明确定义选择嵌套在全局范围内的做法,那么事情可能会变得非常混乱并且难以管理。

使用全局类型的明显原因(主要是重用,也包括嵌套)倾向于决定-通常,我更喜欢一种模式或另一种模式。即如果您要重用某些complexType,而不要重用其他类型,请将它们全部设置为全局。如果您不重用任何东西,请将它们全部嵌套。

例外(这是我经常遇到的问题)是,如果类型的定义构成了模式的大部分复杂性(!),并且它们的包含相对简单。在这种情况下,无论是否重复使用它们,我都建议将它们全局化,因为当您不必遍历庞大的complexType定义时,重组/重新排序文档要容易得多。从理论上讲,它们也更轻便。

在某些情况下,您不能使用嵌套类型来实现某些文档结构-例如,在一个序列中使用两个complexType,这些序列可以包含0到每种类型的无界实例,并且可以任意混合。对于嵌套类型,这是不可能的,但对于引用的全局类型,这是不可能的。


推荐阅读