我知道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数据应该只接受其中一种:
但是如果你{x 3}我的xml数据到我的xmlschema,它是有效的,我不明白为什么。
我是否完全误解了文档?
我使用的验证器是否松散且非标准?如果是的话,什么是一个好的验证器,为什么有人会在我描述的情况下使用选择? (是的,我确实遇到过这个)
答案 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
的子项上本身。