1

我必须为已经使用的 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 中,但这并不能解决问题,因为我仍然有效地破坏了唯一粒子归属规则。

这甚至可以完成,还是我需要让其他开发人员知道这个模式不会验证?

4

1 回答 1

2

我对XML 模式标准的阅读表明您可能是安全的。您只需在架构中定义具有相同名称的非连续元素,以反映将(或可能)生成的 XML。只要所有“错误”实例总是被其他元素分隔并且不连续,这应该不是问题。例如,类似:

  <xs:元素名称="数据">
    <xs:complexType>
      <xs:序列>
        <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:元素>

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

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

如果 details 的 minOccurs="0" 并且上面的第一个 "error" 的 maxOccurs > 1,那么您将无法通过唯一粒子属性规则,因为验证无法验证,如果您在一行中有两个错误元素,则 "error" 的哪个实例" 在它们所属的模式中。但是,只要可以在模式中唯一标识“错误”的每个实例,由于对错误元素和中间元素很好地使用了“minOccurs”和“maxOccurs”,那么你就很好。

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

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

EDIT: Updated to reflect edits in original question.

于 2009-01-23T20:13:03.740 回答