<xs:all> </xs:all>下的元素重复

时间:2009-11-25 08:56:03

标签: xml schema xsd

我的数据结构如下所示

<datastructure>
  <field1>data</field1>
  <field2>data</field2>
  <field3>data</field3>
  <field4>data</field4>
  <field4>data</field4>
  <field4>data</field4>
  <field4>data</field4>
</datastructure>

所有字段必须恰好出现一次,但field4除外,它可以显示[0,无限制]次。也没有理由关心订单。

我无法使用架构来验证这一点。使用序列将起作用:

<xs:element name="datastructure" type="datastructureType"/>
<xs:complexType name ="datastructureType">
  <xs:sequence>
    <xs:element name="field1"/>
    <xs:element name="field2" />
    <xs:element name="field3"/>
    <xs:element name="field4" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>

但是这施加了一个我没有充分理由强加的命令。替代方法是使用all,但这需要将xml修改为:

<datastructure>
  <field1>data</field1>
  <field2>data</field2>
  <field3>data</field3>
  <field4List>
    <field4>data</field4>
    <field4>data</field4>
    <field4>data</field4>
    <field4>data</field4>
  </field4List>
</datastructure>

因为所有孩子的孩子只能有一个maxOccurs。这增加了field4List的负担,这似乎在所有实际问题上都是无用的。

如何编写一个可以验证我的xml的模式,就像序列示例一样,但这不关心顺序?或者,为什么这样的架构首先是一个坏主意?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

基数限制是在许多现实世界模式中使用xs:all的服务器限制。从这个角度来看,放松NG更加灵活。

我应该使用“field4List方式”;它在您的架构中添加了一个额外的元素,但保持无序。