【问题标题】:XML Schema - getting around unique tag constraintXML Schema - 绕过唯一标签约束
【发布时间】:2009-01-23 19:25:15
【问题描述】:

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

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

【问题讨论】:

  • 您的示例不是格式良好的 XML(两个关闭的详细信息标签)。我建议您解决这个问题并提供一些其他示例来演示需要处理的 XML 变化。
  • 对不起,删除多余的结束标签以获取详细信息。
  • 这不是无关紧要的,我认为这是丢失的错字
  • 我相信您现在在 的第一个实例上缺少 关闭标记
  • 我的回答是否充分回答了您的问题?还是您还想了解更多细节?

标签: xml schema xsd tags particles


【解决方案1】:

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

元素> ……

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

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

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

编辑:更新以反映原始问题中的编辑。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多