在定义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到每种类型的无界实例,并且可以任意混合。对于嵌套类型,这是不可能的,但对于引用的全局类型,这是不可能的。