如何在XSD中定义complexType:允许tag2重复,其余元素仅出现一次
搞定XML Schema中任意顺序、部分元素可重复的complexType定义
你碰到的这个问题挺常见的——直接用xs:choice的话,确实会默认允许所有元素无限制重复,完全不符合你对tag1、tag3仅能出现一次的要求。其实只需要对xs:choice做一点小改造,就能完美实现你要的结构。
正确的XSD实现代码
<xs:complexType name="MyType"> <xs:choice maxOccurs="unbounded"> <xs:element name="tag1" type="xs:string" maxOccurs="1"/> <xs:element name="tag2" type="xs:string" maxOccurs="unbounded"/> <xs:element name="tag3" type="xs:string" maxOccurs="1"/> </xs:choice> </xs:complexType>
为什么这样可行?
xs:choice maxOccurs="unbounded":这个设置允许我们从choice的子元素里反复选择任意一个,这样就实现了所有元素可以按任意顺序排列的需求。- 给
tag1和tag3加maxOccurs="1":直接限制这两个元素各自最多只能出现一次(如果要求它们必须出现,而不是可选,只需要再加上minOccurs="1"就行)。 tag2设置maxOccurs="unbounded":明确允许它无限制重复出现。
用这个定义验证你给出的XML示例完全没问题:
<MyType> <tag1>Something</tag1> <tag2>Tag 1</tag2> <tag2>Tag 2</tag2> <tag3>Another something</tag3> </MyType>
额外调整:强制tag1和tag3必须出现
如果你的需求里tag1和tag3是必填项(不能省略),只需要修改这两个元素的定义:
<xs:element name="tag1" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="tag3" type="xs:string" minOccurs="1" maxOccurs="1"/>
这样就能保证tag1和tag3至少出现一次,同时依然保留元素任意顺序、tag2可重复的特性。
内容的提问来源于stack exchange,提问作者JSF
相关产品推荐
相关产品推荐

