使用带有cdata

时间:2016-09-17 03:00:52

标签: java xml web-services cxf cdata

我正在使用CXF使用Web服务,我需要在CDATA标记内发送XML。 为此,我创建了一个拦截器

public class CDATAInterceptor extends AbstractPhaseInterceptor<Message>            {

    public CDATAInterceptor() {
        super(Phase.MARSHAL);
        //addAfter(AttachmentOutInterceptor.class.getName());
    }

    @Override
    public void handleMessage(Message message) {
        message.put("disable.outputstream.optimization", Boolean.TRUE);
        XMLStreamWriter writer = (XMLStreamWriter)     message.getContent(XMLStreamWriter.class);
        if (writer != null && !(writer instanceof CDataXMLStreamWriter)) {
            message.setContent(XMLStreamWriter.class, new CDataXMLStreamWriter(writer));
        }
    }

    public void handleFault(Message messageParam) {
        System.out.println(messageParam);
    }    
}

我正在使用如下定义的自定义CDATAXMLStreamWriter:

public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter {

    private static final Pattern XML_CHARS = Pattern.compile( "[&<>]" );

    public CDataXMLStreamWriter(XMLStreamWriter del) { 
        super(del);
    } 

    @Override 
    public void writeCharacters(String text) throws XMLStreamException { 
        boolean useCData = XML_CHARS.matcher( text ).find();
        if (useCData) { 
            super.writeCData(text);
        }else { 
            super.writeCharacters(text); 
        } 
    }

    public void writeStartElement(String local) throws XMLStreamException { 
        super.writeStartElement(local); 
    } 
}

我按如下方式配置了这个CDATA拦截器

protected void configureCDataInterceptor() {
    CDATAInterceptor inter = new CDATAInterceptor();
    ClientProxy.getClient(this.clientProxy).getOutInterceptors().add(inter);
}

我遇到的问题是CDATA中的xml分为多个部分,就像这样

<![CDATA[part1ofXML]]><![CDATA[part2ofXML]]><![CDATA[part3ofXML]]>

我尝试获取XML并删除所有换行符,并且XML进入一个CDATA块,但问题是此XML已签名,删除字符会破坏签名。

我希望这很清楚,如果帖子很难理解,那就很抱歉。 如果你能给我一个解决这个问题的线索,那就太好了!

谢谢, 胡

0 个答案:

没有答案