如果在JAVA中使用XSD验证,是否可以在有效负载中允许意外元素?

时间:2015-12-24 16:59:25

标签: java validation xsd

我知道有关于这个主题的另一个讨论 xsd validation to allow unexpected elements

但我添加了它仍然无效。

这是我的XSD:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="member">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="card">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="cardNumber">
                                    <xs:simpleType>
                                        <xs:restriction base="xs:string">
                                            <xs:length value="16"/>
                                        </xs:restriction>
                                    </xs:simpleType>
                                </xs:element>
                                <xs:any minOccurs="0"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

这是我在拦截器中运行验证的代码(使用CXF)

final File xsd;
final Schema closeSchema;
try {
    closeSchema = SchemaFactory.newInstance(xsdAnnotation.schemaLanguage()).newSchema(xsd);
} catch (final SAXException e) {
    throw new IllegalStateException(e);
}

// get the payload in the request body 
final String payload = (String) context.getParameters()[i];
closeSchema.newValidator().validate(new StreamSource(new StringReader(payload)));

好吧,我删除了一些其他不相关的逻辑,但验证过程正常工作

如果我通过

<member>
    <card>
        <cardNumber>1234567890123456</cardNumber>
    </card>
</member>

验证工作;但是,如果我通过

<member>
    <card>
        <cardNumber>1234567890123456</cardNumber>
        <memberType>??</memberType>
    </card>
</member>

它给了我例外

“org.xml.sax.SAXParseException; lineNumber:1; columnNumber:75; cvc-complex-type.2.4.c:匹配的通配符是strict,但是找不到元素'memberType'的声明。”

1 个答案:

答案 0 :(得分:0)

啊,我找到了答案。 它应该是

<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>

这个问题是重复的 org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'ReceiptTime'