XSD樱桃选择元素(任何vs全部)

时间:2018-07-04 09:40:17

标签: xsd

我们的客户提供了大量的XML文件。该XML构成了我们软件的输入。但是我们只对这种大规模XML感兴趣。

不过,为了保护我们的软件免受我们感兴趣的部分的细微变化,我们希望验证客户XML所依赖的那些部分。

  • 我们不在乎定义元素的顺序
  • 很多元素(及其任何子元素)对我们都不感兴趣。

示例:

<node>
  <offset>
  <timezone>
  <type>
  <subtype>
  <name>
  <text>
  <calibration-time>
  <pattern>
  ... loads more elements
</node>

在以上元素中,我们的代码仅对元素<type><subtype><name><text>及其任何子元素感兴趣。其余的可以忽略。

这是我的XSD涉及此节点的相关部分:

<xsd:element name="node">
  <xsd:complexType>
    <xsd:all>
      <xsd:element ref="type"/>
      <xsd:element ref="subtype"/>
      <xsd:element ref="name"/>
      <xsd:element ref="text"/>

      <!-- 
        other child elements that we do not validate
      -->
      <xsd:element name="calibration-time" minOccurs="0"/>
      <xsd:element name="offset" minOccurs="0"/>
      <xsd:element name="timezone" minOccurs="0"/>
      <xsd:element name="pattern" minOccurs="0"/>
      ... all the other elements we do not care about
    </xsd:all>
  </xsd:complexType>
</xsd:element>

问题:

  • xsd:any不能在xsd:all内部使用
  • 坚持使用xsd:all意味着我们必须声明 all 元素,甚至是我们不关心的元素。这不是未来的证明。
  • xsd:sequence确实支持xsd:any,但随后强制执行元素顺序。这也不是未来的证明。
  • xsd:sequence不能用多个xsd:s替换我们关心的项目周围的内容,请参见下文

我尝试了这种构造,但这是不合法的:

<xsd:element name="node">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:any processContents="skip" maxOccurs="unbounded"/>
      <xsd:element name="type" type="le2-int"/>
      <xsd:any processContents="skip" maxOccurs="unbounded"/>
      <xsd:element name="subtype" type="le2-int"/>
      <xsd:any processContents="skip" maxOccurs="unbounded"/>
      <xsd:element name="name" type="le2-string"/>
      <xsd:any processContents="skip" maxOccurs="unbounded"/>
      <xsd:element name="text" type="le2-string"/>
      <xsd:any processContents="skip" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

此外,如果事件仍然强制执行元素<type><subtype><name><text>的排序(一个不能出现在另一个的前面)

我肯定不能成为第一个面对这个问题的人吗? 我发现许多密切相关的SO文章几乎涵盖了相同的问题,但没有完全相同的文章,有的文章以其他方式可以轻松解决。

总而言之,有什么方法可以实现:

  • 以任何顺序允许元素吗?
  • 忽略-使用通配符-我们不感兴趣的那些元素?

XSD在这里真的是正确的技术吗?

0 个答案:

没有答案