【问题标题】:XSD that allows any combination of two elements允许任意组合两个元素的 XSD
【发布时间】:2015-04-08 21:12:21
【问题描述】:

我有巨大的 XML 文件,而且都只有 2 种元素类型。但是,每个 xml 元素的层次结构不断变化。是否可以创建具有 2 种元素类型的 XSD,并且 XML 文档的所有元素都将针对此 XSD 进行验证?

例如

假设ab 是唯一可能的元素类型

1.xml

<b attr1="hello">
    <b attr1="Hello">
       <a></a>
       <a></a>
    </b>
    <a></a>
</b>

2.xml

<b attr1="hello">
    <b attr1="hello">
       <a></a>
       <a></a>
       <b attr1="hello">
           <a></a>
       </b>
    </b>
    <a></a>

</b>

我能否使用相同的 XSD 验证两个 XML 文档,该 XSD 定义了元素 ab 的外观?

更新:向“b”节点添加属性。

【问题讨论】:

  • 如果有适用于所有文档的规则,您可以使用 xsd 定义它。如果没有规则,那么也没有什么可定义的。 (使用任何模式语言)
  • 规则是所有 xml 中只有两种元素类型是可能的。但层次结构不断变化
  • 好的,应该可以的。让我修补一下。

标签: xml xsd xml-validation


【解决方案1】:

以下 XSD 将允许 ab 元素的任意组合:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="ab"/>
  <xs:element name="b" type="ab"/>

  <xs:complexType name="ab">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
  </xs:complexType>
</xs:schema>

带属性

根据原始问题的 OP 编辑​​更新:

更新:为“b”节点添加了属性。

要指定属性attr1 必须出现在ab 上,请照常在xs:complexType 中添加xs:attribute 声明:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="ab"/>
  <xs:element name="b" type="ab"/>

  <xs:complexType name="ab">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
    <xs:attribute name="attr1" use="required"/>
  </xs:complexType>
</xs:schema>

要指定属性attr1 必须出现在b 上,而不要求它出现在a 上,请按上述操作,但拆分ab 的定义:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="aType"/>
  <xs:element name="b" type="bType"/>

  <xs:complexType name="aType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="bType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
    <xs:attribute name="attr1" use="required"/>
  </xs:complexType>
</xs:schema>

【讨论】:

  • 需要调查为什么,但你的工作正常,我的不行! (即使在试图快速修复它之后)名声是你的! ;)
  • 太棒了。但还有一个问题。如果元素“a”、“b”具有某些属性,则失败。我在哪里可以为 'a' 或 'b' 的属性指定 'use="required" '。使用 会引发错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多