【问题标题】:Can this XML structure be expressed with XSD? Other validation options?这个 XML 结构可以用 XSD 表示吗?其他验证选项?
【发布时间】:2011-03-15 17:27:40
【问题描述】:

我有以下 XML 文档结构,它已经在生产中并且无法更改:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root xmlns="http://www.domain_name.com/MySchema">
    <optionalString1>a</optionalString1>
    <optionalString2>b</optionalString2>
    <optionalDependee1>c</optionalDependee1>
    <dependent1_1>d</dependent1_1>
    <dependent1_2>e</dependent1_2>
    <optionalString3>f</optionalString3>
    <optionalDependee2>g</optionalDependee2>
    <dependent2_1>h</dependent2_1>
    <dependent2_2>i</dependent2_2>
    <!-- more and more elements -->
</root>

以下是我试图在 XSD 中表达的限制:

  1. XML 元素可以按任何顺序出现。
  2. “optionalStringX”和“optionalDependeeX”可能出现在给定文件中,也可能不出现。
  3. 如果存在“optionalDependeeX”,则需要存在“dependentX_1”和“dependentX_2”。否则,如果“optionalDependeeX”不存在,则“dependentX_1”和“dependentX_2”都不会存在。

我尝试了几种使用“complexType”和“group”的变体,但它们不是有效的 XSD(至少根据 VS2010)。我的“组”实现是这样的:

<xs:schema>

<xs:group name="BaseGroup">
  <xs:all>
    <xs:element name="optionalString1" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString2" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString3" type="xs:string" minOccurs="0" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup1">
  <xs:all>
    <xs:element name="optionalDependee1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup2">
  <xs:all>
    <xs:element name="optionalDependee2" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="Combo1">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
  </xs:all>
</xs:group>

<xs:group name="Combo2">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
    <xs:group ref="DependentGroup2"/>
  </xs:all>
</xs:group>

<xs:complexType name="RootType">
  <xs:choice minOccurs="1" maxOccurs="1">
    <xs:group ref="BaseGroup" />
    <xs:group ref="Combo1" />
    <xs:group ref="Combo2" />
  </xs:choice>
</xs:complexType>

<xs:element name="root" type="RootType" />

</xs:schema>

我是用于验证 XML 的模式的新手,并且一直认为 XSD 足够灵活,可以表示所有有效 XML 的结构。如果我可以重写 XML 文件的结构,我会将dependentX_1 和dependentX_2 设为 optionalDependeeX 的属性或子元素,因为它们会表达依赖关系。

  1. 可以在 XSD 架构中表示这些限制吗?如果可能,我们会尽量坚持使用 XSD,因为据我了解,它的工具和支持比其他验证解决方案广泛得多。
  2. 如果不是,还有哪些其他 XML 验证器在 Python、Perl 以及 C 或 C++ 中具有良好的支持,并且可以处理比 XSD 更复杂的文档结构? RelaxNG 或 Schematron 是否合适?优点和缺点?除了 XSD,我从未使用过任何东西。

【问题讨论】:

  • 不,您不能在 XSD 中执行此操作 - 诸如“如果元素 X 存在,则元素 Y 必须存在”之类的事情无法在 XML 模式中表达。查看 Schematron 或 RelaxNG 作为替代方案

标签: xml xsd relaxng schematron


【解决方案1】:

由于您已正确完成,可以使用 xsd:all 放宽排序,但不支持您尝试执行的其他操作。 next version of XML Schema,即 1.1,可以支持您拥有的其他一些变体。但是 1.1 不是最终版本,没有多少库可以理解这一点。我建议您查看schematron 看看是否有帮助。

【讨论】:

    【解决方案2】:

    到目前为止,我们一直认为 XSD 足够灵活,可以表示所有有效 XML 的结构

    不,这与事实相去甚远——至少对于 XSD 1.0 而言。事实上,如果您想允许元素以任意顺序出现,除了说明哪些元素必须出现以及哪些是可选的之外,您可以施加的约束很少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2011-10-23
      • 2012-09-16
      相关资源
      最近更新 更多