XML 模式中组和复杂类型之间的区别?

Yan*_*kou 5 xml xsd

根据w3schools,该group元素是该元素的子元素complexType。以下 XML 架构文件 (XSD) 可以互换使用吗?

没有组元素的XSD :

<xs:complexType name="personInfo">
    <xs:sequence>
        <xs:element name="firstName" type="xs:string"/>
        <xs:element name="lastName" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="personId" type="xs:string"  use="required"/>
</xs:complexType>

<xs:element name="person" type="personInfo"/>
Run Code Online (Sandbox Code Playgroud)

带有组元素的XSD :

<xs:group name="personGroup">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string"/>
    <xs:element name="lastName" type="xs:string"/>
  </xs:sequence>
  <xs:attribute name="personId" type="xs:string"  use="required"/>
</xs:group>

<xs:complexType name="personInfo">
  <xs:group ref="personGroup"/>
</xs:complexType>

<xs:element name="person" type="personInfo"/>
Run Code Online (Sandbox Code Playgroud)

如果是,它们有什么区别?groupcomplexType具有相同效果时为什么要使用该元素?

小智 2

您的“ XSD with group element ”示例中的内容不正确:

<xs:group name="personGroup">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string"/>
    <xs:element name="lastName" type="xs:string"/>
  </xs:sequence>
  <!-- Wrong -->
  <xs:attribute name="personId" type="xs:string"  use="required"/>
</xs:group>
Run Code Online (Sandbox Code Playgroud)

您不能在 的根内部定义属性<xs:group>。您可以拥有一个包含元素的组,并且这些元素可以有自己的属性。这实际上是群体和复杂类型之间的区别之一。

组只能包含内容模型或注释(即,它们的直接子级只能是以下 3 个元素之一:<xs:all /><xs:choice /><xs:sequence />或文档元素)。请参阅第 3.7.2 节下的https://www.w3.org/TR/xmlschema11-1/#cModel_Group_Definitions

<group
  id = ID
  maxOccurs = (nonNegativeInteger | unbounded)  : 1
  minOccurs = nonNegativeInteger : 1
  name = NCName
  ref = QName
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (all | choice | sequence)?)
</group>
Run Code Online (Sandbox Code Playgroud)

复杂类型的行为非常相似,因为它们也可以具有与组完全相同的内容模型,但它们也可以定义<xs:attributes>. 您甚至可以拥有只定义属性的复杂类型,而这是组无法做到的。