为什么xs:choice在生成的xml中允许多个不同的xs:元素?

时间:2016-09-19 16:54:48

标签: xml xsd xsd-validation

我知道this related question并且我理解我的问题与答案相矛盾,但以下XML文件完全符合以下XMLSchema

我的XML数据:

<?xml version="1.0" encoding="utf-8"?>
<myElements>
    <el1>bla</el1>
    <el1>bla</el1>
    <el1>blabla</el1>
    <el2>bgt</el2>
    <el2>pel</el2>
    <el3>sdf</el3>
</myElements>

我的XMLSchema:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="myElements">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="el1" />
                <xs:element name="el2" />
                <xs:element name="el3" />
                <xs:element name="el4" />
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

W3schools和其他消息来源说:

  

XML Schema choice元素只允许包含其中一个元素   声明将出现在包含元素中。

在我看来,这意味着我的XML数据应该只接受其中一种:

  • 0到任何el1
  • 0到任何el2
  • 0到任何el3
  • 0到任何el4

但是如果你{x 3}我的xml数据到我的xmlschema,它是有效的,我不明白为什么。

我是否完全误解了文档?

我使用的验证器是否松散且非标准?如果是的话,什么是一个好的验证器,为什么有人会在我描述的情况下使用选择? (是的,我确实遇到过这个)

1 个答案:

答案 0 :(得分:5)

  

为什么xs:choice在生成的xml中允许多个不同的xs:element

因为您向maxOccurs="unbounded"添加了xs:choice

您对xs:choice/@maxOccurs="unbounded"的含义的理解需要进行调整。

表示您首先做出选择,然后根据xs:choice上的出现限制重复所选元素。

意味着您可以根据xs:choice上的出现限制进行多次选择。选择是独立的,因此当xs:choice大于xs:choice/@maxOccurs时,1的子元素可能会交错。

如果您想表达可以做出单一选择并且可以连续重复所选元素的约束,那么将maxOccurs="unbounded"放在xs:choice而不是xs:choice的子项上本身。