Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复无效的XML,以便SpringWebServiceTemplate可以使用它_Xml_Spring_Soap_Webservicetemplate - Fatal编程技术网

如何修复无效的XML,以便SpringWebServiceTemplate可以使用它

如何修复无效的XML,以便SpringWebServiceTemplate可以使用它,xml,spring,soap,webservicetemplate,Xml,Spring,Soap,Webservicetemplate,我正在使用Spring的WebServiceTemplate来使用Soap服务。偶尔,此Soap服务会使用无效的XML进行响应。我想截取它的解析器并在解析之前修复无效的XML。我怎么能这么做?现在我打电话: wsTemplate.sendSourceAndReceiveToResult(new StreamSource(new StringInputStream(msg)),new StreamResult(stringWriter)) 我想我必须调用sendSourceAndReceive并

我正在使用Spring的WebServiceTemplate来使用Soap服务。偶尔,此Soap服务会使用无效的XML进行响应。我想截取它的解析器并在解析之前修复无效的XML。我怎么能这么做?现在我打电话:

wsTemplate.sendSourceAndReceiveToResult(new StreamSource(new StringInputStream(msg)),new StreamResult(stringWriter))
我想我必须调用
sendSourceAndReceive
并定义我自己的
SourceExtractor
,但当我真的想做一些简单的事情时,我似乎在这个过程中干预太多了

这就是我要解决的问题:

An invalid XML character (Unicode: 0x1f) was found in the element content of the document.

SystemErr     R    at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java :210)
XML 1.1接受该字符,但文档描述为XML 1.0:

<?xml version="1.0" encoding="utf-8"?>


因此,我想要的是将该字符替换为选项卡或空格。

我能够通过如下方式装饰webServiceTemplate的WebServiceMessageFactory在解析消息之前修复该消息:

final WebServiceMessageFactory mfOriginal = myWebServiceTemplate.getMessageFactory();
WebServiceMessageFactory mfDecorator = new WebServiceMessageFactory() {
    @Override
    public WebServiceMessage createWebServiceMessage(final InputStream inputStream) throws InvalidXmlException, IOException {
        InputStream decoratedIs = new InputStream() {

            @Override
            public int read() throws IOException {
                int nextByte = inputStream.read();
                // Replacing the invalid character with a tab. Touching nothing else.
                if (nextByte == 0x1f) {
                    nextByte = 0x09;
                }
                return nextByte;
            }
        };
        return mfOriginal.createWebServiceMessage(decoratedIs);
    }

    @Override
    public WebServiceMessage createWebServiceMessage() {
        return mfOriginal.createWebServiceMessage();
    }
};
myServiceTemplate.setMessageFactory(mfDecorator);

定义自己的SourceExtractor是不够的,因为在调用SourceExtractor的extractSource方法之前,解析会在框架的较低级别中断。