Java XML验证忽略不属于模式的xml元素

时间:2016-03-24 08:27:17

标签: java xml spring validation

我正在开发一个与SOAP Web服务交互的Spring Java应用程序。我们已经对响应进行了严格的验证(使用如下所示的拦截器),这是确保已经商定的强制性元素不会被遗漏的必要条件。

public class MyPayloadValidatingInterceptor extends org.springframework.ws.client.support.interceptor.PayloadValidatingInterceptor{

    @Override
    protected boolean handleResponseValidationErrors(final MessageContext messageContext,
            final SAXParseException[] errors) {
        for (SAXParseException error : errors) {
            this.logger.error("XML validation error in SOAP response: " + error.getMessage());
        }
        throw new MyResponseValidationException(errors);
    }
}

即使我们不使用新元素,应用程序不向前兼容,即使对SOAP Web服务上的Schema(响应中的新元素)进行小的更改并强制客户端升级架构,这也使我们的应用程序变得脆弱。 我想要一种方法来忽略响应xml中的未识别元素。同时严格验证作为我的客户端应用程序正在使用的当前架构的一部分的必需元素。

例如,如果架构为

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Employee" xmlns:tns="http://www.example.org/Employee"
    elementFormDefault="qualified">
    <element name="Employee">
        <complexType>
            <sequence>
                <element name="EmployeeId" type="string"></element>
                <element name="Name" type="string"></element>
                <element name="SecondName" type="string" minOccurs="0"></element>
            </sequence>
        </complexType>
    </element>
</schema>

对于下面的xml,我希望验证拦截器忽略未识别的元素,No MyResponseValidationException

<tns:Employee xmlns:tns="http://www.example.org/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Employee Employee.xsd ">
  <tns:EmployeeId>id</tns:EmployeeId>
  <tns:Name>Jack</tns:Name>
  <tns:NewElement>unidentified</tns:NewElement>
  <tns:SecondName>Second Jack</tns:SecondName>
</tns:Employee>
  

验证错误我看到的是,   cvc-complex-type.2.4.a:内容无效   发现以元素'tns:NewElement'开头。之一   “{http://www.example.org/Employee”:SecondName}'是预期的。

对于这个xml,它应该导致MyResponseValidationException

<tns:Employee xmlns:tns="http://www.example.org/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Employee Employee.xsd ">
  <tns:EmployeeId>tns:EmployeeId</tns:EmployeeId>
  <!--tns:Name>tns:Name</tns:Name Mandatory Element missing-->  
  <tns:SecondName>tns:SecondName</tns:SecondName>
</tns:Employee>
  

验证错误我看到的是cvc-complex-type.2.4.a:无效的内容是   发现以元素'tns:SecondName'开头。之一   “{http://www.example.org/Employee”:名称}'是预期的。

请您建议区分缺少元素和不属于架构的元素的最佳方法。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为这是不可能的 - 您已经添加了严格的验证,但要求非严格并同时绕过未知元素。

也许你需要添加某种

<xs:any processContents="skip" minOccurs="0"/>

在架构的末尾,然后要求客户在之后添加所有未知元素