我见过这样一个例子:
<xsd:element name="Product">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductName" type="xsd:string" />
<xsd:element name="Customer" type="xsd:CustomerType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CustomerType">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FullName" type="xsd:string" />
<xsd:element name="Age" type="xsd:string" />
<xsd:element name="Age" type="xsd:occupation" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
我想知道在这种情况下,为什么有人会选择type
而不是ref
:
<xsd:element name="Product">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductName" type="xsd:string" />
<xsd:element ref="Customer" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FullName" type="xsd:string" />
<xsd:element name="Age" type="xsd:string" />
<xsd:element name="Age" type="xsd:occupation" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
有人能解释一下用Type
代替ref
有什么积极的一面吗?我所知道的是,ref
也可以有minOccurs
和maxOccurs
选项,因此您可以在反序列化代码中将ref
定义为数组。
有很多方法可以解决这个问题。我想这一切都始于一些基本原则,比如创作风格的一致性。从那时起,人们开始分析以一种方式与另一种方式进行比较的含义;名字被命名为:俄罗斯娃娃,萨拉米切片,神圣的眼睛,伊甸园。如果您想了解更多信息,搜索XSD创作风格(也称为XSD设计模式)将产生大量涉及此主题的网站。这个链接和这个链接都是很好的"快餐"式的参考资料,我会从。。。虽然我不同意其中的一些说法,例如contains only one global element
(因此,如果我为Web服务定义一个rq/rs模式,我就不符合要求了?)总体上是一个很好的开端。
在您的案例中,基于引用的元素一致地定义内容模型表明了"Salami Slice"模式:所有元素都是全局的,类型是本地的(匿名的)。第一个含义是不能去掉与标记相关联的命名空间。
不使用引用的元素,而是依赖于局部定义,并且类型是全局的,这表明存在"Venetian Blind"模式。根据上面的名称空间注释,使用这种方法,现在可以通过在schema元素上设置elementFormDefault属性来控制名称空间。
与粒子关联的minOccurs/maxOccurs在此处不相关。对于全局元素,这些属性不适用。对于内容模型粒子,元素是一种,无论元素是refed还是局部的,都没有区别。