XSD-在XML模式中使元素可选和强制

时间:2018-12-05 11:01:54

标签: xml xsd xsd-validation

我为XML生成的模式如下:

 <xs:complexType name="ComplexElement1">
        <xs:sequence>
            <xs:element name="ComplexType1" type="ComplexType1">
            </xs:element>
            <xs:element name="ComplexType2" type="ComplexType2" minOccurs="0">
            </xs:element>
            <xs:element name="ComplexType3">
                <xs:complexType>
                    <xs:sequence maxOccurs="unbounded">
                        <xs:element name="ComplexType4" type="ComplexType4"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ComplexType5" type="ComplexType5" minOccurs="0"/>
            <xs:element name="ComplexType6" type="ComplexType6" minOccurs="0" maxOccurs="1"/>
            <xs:element name="SimpleType1" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="ComplexType7" type="ComplexType7" minOccurs="0" maxOccurs="1"/>
            <xs:element name="SimpleType2" minOccurs="1" maxOccurs="1" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="Attribute1" type="StringLength3WithNoSpace" use="required"/>
        <xs:attribute name="Attribute2" type="ComplexAttribute1"/>
        <xs:attribute name="Attribute3" type="xs:boolean" use="optional"/>
    </xs:complexType>

从XSD中可以看到,ComplexType 5,6和7以及SimpleType 1都是可选元素。 另外,SimpleType2是一个强制元素。

当我尝试不包含SimpleType2作为请求的请求时,我会收到类似

的消息
Message validation failed. Errors: [cvc-complex-type.2.4.b: The content of element 'ComplexElement1' is not complete. One of '{"somePath":SimpleType2}' is expected.]

工作正常。

但是,在我不放置任何可选元素ComplexType 5、6和7,SimpleType 1以及必需的SimpleType2的情况下,就会出现问题。

我期望的消息与上面的消息相同-因为使用minOccurs =“ 0”

使序列中的所有其他元素都是可选的

但是,我收到的实际错误消息是:

Message validation failed. Errors: [cvc-complex-type.2.4.b: The content of element 'ComplexElement1' is not complete. One of '{"somePath":ComplexType5, "somePath":ComplexType6, "somePath":SimpleType1, "somePath":ComplexType7, "somePath":SimpleType2}' is expected.]<

这不是真的正确,因为我的架构仅将SimpleType2定义为强制性,将所有其他类型定义为可选。

关于如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:0)

模式验证器查看每个元素,并确定在当前位置是否允许该元素。如果它找到了不允许的元素,或者在不允许序列结尾的位置找到了序列的结尾,那么它将为您提供可以有效出现在当前位置的元素列表。这就是它设计的工作方式,您将无法更改它。