Getting Raw XML From SOAPMessage in Java Getting Raw XML From SOAPMessage in Java java java

Getting Raw XML From SOAPMessage in Java


You could try in this way.

SOAPMessage msg = messageContext.getMessage();ByteArrayOutputStream out = new ByteArrayOutputStream();msg.writeTo(out);String strMsg = new String(out.toByteArray());


If you have a SOAPMessage or SOAPMessageContext, you can use a Transformer, by converting it to a Source via DOMSource:

            final SOAPMessage message = messageContext.getMessage();            final StringWriter sw = new StringWriter();            try {                TransformerFactory.newInstance().newTransformer().transform(                    new DOMSource(message.getSOAPPart()),                    new StreamResult(sw));            } catch (TransformerException e) {                throw new RuntimeException(e);            }            // Now you have the XML as a String:            System.out.println(sw.toString());

This will take the encoding into account, so your "special characters" won't get mangled.


It turns out that one can get the raw XML by using Provider<Source>, in this way:

import java.io.ByteArrayOutputStream;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stream.StreamResult;import javax.xml.ws.Provider;import javax.xml.ws.Service;import javax.xml.ws.ServiceMode;import javax.xml.ws.WebServiceProvider;@ServiceMode(value=Service.Mode.PAYLOAD)@WebServiceProvider()public class SoapProvider implements Provider<Source>{    public Source invoke(Source msg)    {        StreamResult sr = new StreamResult();        ByteArrayOutputStream out = new ByteArrayOutputStream();        sr.setOutputStream(out);        try {            Transformer trans = TransformerFactory.newInstance().newTransformer();            trans.transform(msg, sr);            // Use out to your heart's desire.        }        catch (TransformerException e) {            e.printStackTrace();        }            return msg;    }}

I've ended up not needing this solution, so I haven't actually tried this code myself - it might need some tweaking to get right. But I know this is the right path to go down to get the raw XML from a web service.

(I'm not sure how to make this work if you absolutely must have a SOAPMessage object, but then again, if you're going to be handling the raw XML anyways, why would you use a higher-level object?)