为什么设置minOccurs="0"的XML元素仍提示不允许为空?
问题核心原因
你对minOccurs="0"的属性作用理解有误:
minOccurs约束的是FURNITURE元素在其父节点内的出现次数,设为0仅代表你可以完全省略<FURNITURE>标签,省略状态可以通过校验。- 只要你写了
<FURNITURE>标签(哪怕是自闭合的空标签<FURNITURE />),就代表这个元素已存在,必须符合你定义的复杂类型结构:你当前定义了FURNITURE内部必须按顺序包含ID、rNumber、type三个必填子节点,空元素没有对应子节点,自然触发报错。
解决方案
根据你的实际需求二选一即可:
方案1:允许<FURNITURE />空元素存在
给FURNITURE内部的sequence节点添加minOccurs="0"属性,代表元素存在时,内部子节点序列可以省略:
<xsd:element name="FURNITURE" minOccurs="0" maxOccurs="6"> <xsd:complexType> <xsd:sequence minOccurs="0"> <xsd:element name="ID" type="xsd:integer" /> <xsd:element name="rNumber" type="xsd:string" /> <xsd:element name="type" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element>
修改后三种情况都可通过校验:
- 完全省略
<FURNITURE>标签 - 使用自闭合空标签
<FURNITURE /> - 填写完整的三个子节点
方案2:不需要空元素,仅允许省略该元素
不需要修改XSD,直接删除代码里的<FURNITURE />空标签即可,完全不写该元素就符合minOccurs="0"的规则。
内容的提问来源于stack exchange,提问作者Javelin
相关产品推荐
相关产品推荐

