没有顺序和选择性限制的XSD

时间:2020-08-07 10:51:48

标签: xsd

我需要验证包含随机顺序元素的XML,其中一些必须存在,而某些仅一次。顺便说一句,某些元素可以递归嵌套。

例如,一个房间应该包含一个门以及任意数量的盒子和元素。框可以包含其他框或元素。

示例XML:

<Room>
    <Element />
    <Box>
        <Box>
            <Element />
            <Box></Box>
            <Element />
        </Box>
        <Element />
    </Box>
    <Door />
    <Element />
</Room>

此示例非常简单,但是在我的情况下,<Room>中可以包含很多元素。递归不是问题。问题是使<Door>成为必需,并以不需要的顺序以不需要的同级为准。

UPD :问题是关于XSD 1.0,因为我使用的是.NET,并且没有针对XSD 1.1的免费库

1 个答案:

答案 0 :(得分:0)

根据我正在阅读的内容,我认为您可能需要使用架构(XSD)指示器。

查看以下链接以了解更多信息:Schema indicators

随机顺序

来自您的问题:

我需要验证包含随机顺序元素的XML

可能的答案:

使用“全部”指示符(请参见link),您可以指定元素以随机顺序排列。

所有指示器

该指标指定子元素可以以任何顺序出现,并且每个子元素只能出现一次:

发生次数

来自您的问题:

其中某些必须存在,而某些则必须存在

可能的答案:

如果我正确理解它,则需要指定一个元素存在或可以使用的次数。这称为发生,再次可以在后面的link上找到。您必须按照自己的要求确定minOccurs和maxOccurs。

出现指示器

出现指示器用于定义元素出现的频率。

“ maxOccurs”指示符指定元素可以出现的最大次数:

“ minOccurs”指示符指定元素可以出现的最小次数:

包括示例在内的所有内容都可以在XSD/Schema indicators上找到。

您的XSD(xml模式)可能如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Room" type="Room_T"/>

  <xs:complexType name="Room_T">
    <xs:all>
      <xs:element name="Element" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="Box" type="Box_T" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="Door" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="Box_T">
    <xs:all>
      <xs:element name="Element" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element name="Box" type="Box_T" minOccurs="0" maxOccurs="1"/>
    </xs:all>
  </xs:complexType>

</xs:schema>

我没有检查上面的代码是否有效,但是我认为它一定可以帮助您入门!

相关问题