XML Schema - 绕过唯一标记约束

时间:2009-01-23 19:25:15

标签: xml schema xsd tags particles

我必须为已经使用的XML格式制作模式。现有的XML已由不同的程序生成,听起来很难找到需要更改的所有位置以便使用更常规的XML格式。

这是一个类似于我们的XML结构的例子:

<data>
    <summary>some info</summary>
    <error>error message (only if there was an error)</error>
    <details>more info
        <x>more</x>
        <y>even more</y>
    </details>
    <error>another error message</error>
    <z>some extra info</z>
</data>

请注意,错误标记在同一级别重复使用,并且在某些项目之后但不在其他项目之后,因此我不能只设置maxOccurs =“unbounded”。我已经尝试在xsd:sequence中包装相关的错误/其他标记对,但这并不能解决问题,因为我仍然在有效地打破了“唯一粒子归因”规则。

甚至可以这样做,还是我需要让其他开发人员知道这个架构不会验证?

1 个答案:

答案 0 :(得分:2)

我对XML schema standard的解读说你可能很安全。您只需在模式中定义具有相同名称的非连续元素,以反映将生成(或可以)生成的XML。只要所有“错误”实例总是由其他元素分隔而不是连续的,这应该不是问题。例如,像:

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="error" type="xs:string"/>

  <xs:complexType name="detailsType">
    ....
  </xs:complexType>

如果详细信息有minOccurs =“0”且上面的第一个“错误”有一个maxOccurs&gt; 1,然后您失败了Unique Particle Attribution规则,因为验证无法验证,如果一行中有两个错误元素,那么它们所属的架构中的“错误”实例。但是,只要每个“错误”实例都可以在模式中唯一标识,由于错误元素和插入元素的良好使用“minOccurs”和“maxOccurs”,那么你就是好的。

只要模式验证器始终可以使用minOccurs和maxOccurs(例如)明确地确定引用哪个实例,您甚至可以连续出现“错误”实例。

想想xhtml,其中元素可以以任意顺序出现,任意重复。

编辑:已更新,以反映原始问题中的修改。