xs:XSD中的选择是否允许生成XML中的多个元素?

时间:2014-11-28 13:01:45

标签: xml xsd

我坚持使用XSD'选择'元素描述。它指出,只有一个元素,来自该标记内的元素,可以在有效的XML中找到:

  

允许所选内容中包含一个且仅包含一个元素   组包含在包含元素中。

http://msdn.microsoft.com/en-us/library/ms256109%28v=vs.110%29.aspx

另一方面,看起来像属性 maxOccurs ="无界" 可能会改变相反的情况,现在任何数量的元素都可能出现在用&表示的类型中#39;选择':请参考这个问题:

XSD - how to allow elements in any order any number of times?

那么在里面有选择指标的类型中可以找到多少个元素?

2 个答案:

答案 0 :(得分:5)

表示选择的MSDN页面允许"所选组中包含的一个且仅有一个元素"用得很厉害。嗯,不,那太慷慨了。作为xsd:choice的描述,它是错误的。

选项包含零个或多个替代项,并且当且仅当这些替代项中的至少一个与输入匹配时才匹配部分输入。 (实际上,这几乎总是意味着,如果其中一个选项与输入相匹配,那么:如果有多个替代方案与输入匹配,则内容模型几乎肯定会违反“独特粒子归因”#39规则。)

因此,在备选方案A1,A2,A3,......中进行选择当且仅当A1匹配该序列或A2,或A3,......或An时,才匹配输入中的元素序列。

如果每个替代A1,...,An是具有minOccurs = maxOccurs = 1的单个元素,那么它们都不是可重复的,并且如果选择本身不可重复,那么您引用的描述或多或少是准确的。但是,任何一些事情都可能导致多个元素被一个选择匹配:

  • 选择本身可以重复(正如词典已经指出的那样);以下选项匹配A,B和C元素的任何序列:

    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="A"/>
      <xsd:element ref="B"/>
      <xsd:element ref="C"/>
    </xsd:choice>
    
  • 个别选择可能是可重复的;以下选项匹配任何非空的A元素序列,或任何非空的B元素序列,或恰好一个C元素:

    <xsd:choice>
      <xsd:element ref="A" maxOccurs="unbounded"/>
      <xsd:element ref="B" maxOccurs="unbounded"/>
      <xsd:element ref="C"/>
    </xsd:choice>
    
  • 各个备选方案可以是匹配多个元素的序列或选择;以下选项匹配A和B元素的任何非空序列,或序列D,E,F:

    <xsd:choice>
      <xsd:choice maxOccurs="unbounded">
        <xsd:element ref="A"/>
        <xsd:element ref="B"/>
      </xsd:choice>
      <xsd:sequence>
         <xsd:element ref="D"/>
         <xsd:element ref="E"/>
         <xsd:element ref="F"/>
      </xsd:sequence>
    </xsd:choice>
    

您问题的答案

  

那么在里面有选择指标的类型中可以找到多少个元素?

与问题的答案相同

  

那么在元素中可以找到多少个元素?

  

那么与正则表达式匹配的符号序列有多长?

答案 1 :(得分:2)

  

那么在里面有选择指标的类型中可以找到多少个元素?

取决于minOccurs元素的maxOccurs / choice

child1child2中的一个:

<xs:choice>
  <xs:element name="child1" type="xs:int"/>
  <xs:element name="child2" type="xs:string"/>
</xs:choice>

child1child2之一或无:

<xs:choice minOccurs="0">
  <xs:element name="child1" type="xs:int"/>
  <xs:element name="child2" type="xs:string"/>
</xs:choice>

child1child2中的至少一个或多个,按任意顺序排列:

<xs:choice maxOccurs="unbounded">
  <xs:element name="child1" type="xs:int"/>
  <xs:element name="child2" type="xs:string"/>
</xs:choice>

child1child2中的零个或多个,按任意顺序排列:

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="child1" type="xs:int"/>
  <xs:element name="child2" type="xs:string"/>
</xs:choice>

我个人试图避免模式中可重复的选择和序列,因为它们也构造了结构&#34;异构&#34;。