XSD:嵌套类型与全局类型
时间:2020-03-05 18:46:28 来源:igfitidea点击:
定义XSD时,可以选择将类型定义为嵌套类型或者全局类型(complexType)。
我知道,在涉及形态或者元素重用时,全局类型的用途更多。
但是,如果我们有大数据模型,则必须为每个级别定义一个全局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属性与元素)。
解决方案
回答
在给出的示例中,两者之间没有真正的区别,也没有明显的优点或者缺点。
但是,在较大的模式中,如果未明确定义选择嵌套在全局范围内的做法,那么事情可能会变得非常凌乱并且难以管理。
使用全局类型的明显原因(主要是重用,也有嵌套)通常决定了我更喜欢一种模式或者另一种模式。 IE。如果我们要重用某些complexType,而不要重用其他,则将它们全部设置为全局。如果我们不重用任何东西,请将它们全部嵌套。
例外(这是我经常遇到的事情)是,如果类型的定义构成了模式的复杂性(!)的大部分,并且它们的包含相对简单。在这种情况下,无论是否重复使用它们,我都建议将它们全局化,因为当我们不必遍历庞大的complexType定义时,重组/重新排序文档要容易得多。从理论上讲,它们也更轻便。
在某些情况下,我们无法使用嵌套类型来实现某些文档结构,例如,在一个序列中使用两个complexType,这些序列可以包含0到每种类型的无界实例,并且顺序任意混合。对于嵌套类型,这是不可能的,但是对于引用的全局类型,这是不可能的。