xml架构序列多个相同的元素

时间:2014-03-08 15:03:06

标签: xml xsd

我试图从w3学校了解关于序列元素的例子。我认为序列中的元素只能显示一次,但w3学校的例子让我相信不然。这是一个例子......

<xs:element name="pets">
  <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="dog" type="xs:string"/>
      <xs:element name="cat" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element> 

因此对w3学校的解释说“这个例子显示了一个名为”宠物“的元素的声明,它可以在序列元素中包含零个或多个以下元素,dog和cat。我试着通过这样做来测试....

抱歉第二个例子我错误地粘贴了....这就是我的意思,不会根据顶部的架构进行验证......

  <pets>
     <dog>something</dog>
     <dog>something else</dog>
     <cat>else</cat>
  </pets>

但验证者给了我错误http://www.corefiling.com/opensource/schemaValidate.html。 我想了解这两个例子。允许有多个相同元素的序列,以及序列中每个元素必须存在且必须只显示一次的序列。

任何示例和建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

该架构允许内容为序列“<dog>后跟<cat>”的零或更多次重复。换句话说,pets元素可以是空的,也可以包含狗猫,狗猫猫等,但不能包含狗狗。

如果您想要任意组合中的任意数量的狗或猫元素,那么您可能需要choice而不是sequence

<xs:element name="pets">
  <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="dog" type="xs:string"/>
      <xs:element name="cat" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element> 

这将允许X重复零次或多次,其中X是一只狗或一只猫元素。

答案 1 :(得分:0)

序列元素中声明了minOccurs / maxOccurs个约束,因此它们适用于sequence的{​​{1}},即一个 (dog, cat),然后是一个猫。您声明序列可以重复,而不是单个元素。因此,您的架构将验证此类文档,例如:

dog

您发布的文档无法验证,因为它包含的<pets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema6.xsd"> <dog>something</dog> <!-- sequence 1 --> <cat>else</cat> <dog>something</dog> <!-- sequence 1 --> <cat>else</cat> <dog>something</dog> <!-- sequence 1 --> <cat>else</cat> </pets> 元素不属于允许的序列:

dog

您的架构接受空序列(无 <pets> <dog>something</dog> <!-- not allowed - where is the following cat? --> <dog>something else</dog> <!-- sequence dog,cat - OK --> <cat>else</cat> </pets> s或cat s)以及无界序列(任意数量的dogcat s),但必须如果有dog,则始终为cat;如果有dog则为dog,且cat必须在dog之前}。这是一个非常严格的规则。

如果您想以任何顺序接受任意数量的catcat,则必须在单个元素声明中重新定义这些约束,因为它们使用的是默认值,默认值为dog minOccurs="1"

maxOccurs="1"

现在,您在每个序列中允许0 <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="dog" type="xs:string" minOccurs="0"/> <xs:element name="cat" type="xs:string" minOccurs="0"/> </xs:sequence> cat,因此您可以按任意顺序添加dogdog,只有{{1 s,只有cat s,有空序列,没有序列...

cat

(您也可以使用dog获得与其他答案相同的结果。)