0

是否有内联平凡复数 complexTypes 与单独定义它们的既定标准?

详细说明:在定义一些 XML 模式时,我经常遇到希望一个元素包含多个相同类型的子元素的情况。例如,描述数据库中表的模式具有一个fields元素,该元素可以包含一个或多个field元素。我可以在复数fields元素的定义中创建一个内联 complexType:

<xs:element name="fields" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="field" type="table-field" 
                  minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

或者我可以单独定义一个普通fields类型并使用它:

<xs:element name="fields" type="table-field-collection" minOccurs="1" maxOccurs="1">

<!-- Elsewhere: -->
<xs:complexType name="table-field-collection">
  <xs:sequence>
    <xs:element name="field" type="table-field" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

第一种方法使用匿名类型创建了稍微混乱的标记,而第二种方法创建了许多额外的琐碎复杂类型。是否就首选哪种方法达成共识?

4

1 回答 1

2

对此并没有真正的既定标准。真的有三个选择:

  1. “字段”必须定义为复杂类型并重复使用(上面的表字段集合)
  2. “字段”是具有匿名子类型的元素
  3. 没有字段元素。相反,“字段”只是在父元素中重复。

我已经为许多公司指定了建模指南并使用了所有这些模式。最近,我倾向于第三个——封装fields元素实际上没有任何语义意义,除了在某些图形工具中查看文档时进行很好的分组。如果您要使用 JAXB 之类的东西来处理这个问题,您可能会对此感到恼火fields——还有一件事可以为空。

如果您想从技术角度问自己一个相关的问题,那么就是:您希望能够从 table-field-collection 继承并使用 覆盖它xsi:type,还是重用它?如果是,请选择复杂类型。如果不是,请选择您喜欢的风格。

于 2013-05-12T21:39:38.113 回答