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

XSD - Making elements optional and mandatory in an XML schema

我为 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 是一个 mandatory 元素。

当我尝试一个没有 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 是强制性的,而所有其他的都是可选的。

有什么办法可以解决这个问题吗?

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