Java Soap request - reading soap response

java, soap, web-services

Solution

Here is the whole working example for some other xml example;

public static void main(String[] args) throws IOException, SOAPException {

    String xmlInput = "  <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://litwinconsulting.com/webservices/\">\n"
            + "   <soapenv:Header/>\n"
            + "   <soapenv:Body>\n"
            + "   <web:RES>\n"
            + "      <web:RETURNCODE>100 </web:RETURNCODE> \n"
            + "   </web:RES>\n"
            + "      <web:GetWeather>\n"
            + "         <!--Optional:-->\n"
            + "         <web:City>%CITY%</web:City>\n"
            + "      </web:GetWeather>\n"
            + "   </soapenv:Body>\n"
            + "  </soapenv:Envelope>";

    MessageFactory factory = MessageFactory.newInstance();
    SOAPMessage message = factory.createMessage(
            new MimeHeaders(),
            new ByteArrayInputStream(xmlInput.getBytes(Charset
                    .forName("UTF-8"))));

    SOAPBody body = message.getSOAPBody();

    NodeList returnList = body.getElementsByTagName("web:RES");

    boolean isSuccess = false;
    for (int k = 0; k < returnList.getLength(); k++) {
        NodeList innerResultList = returnList.item(k).getChildNodes();
        for (int l = 0; l < innerResultList.getLength(); l++) {
            if (innerResultList.item(l).getNodeName()
                    .equalsIgnoreCase("web:RETURNCODE")) {
                isSuccess = Integer.valueOf(innerResultList.item(l)
                        .getTextContent().trim()) == 100 ? true : false;
            }
        }
    }
    if (isSuccess) {
        NodeList list = body.getElementsByTagName("web:GetWeather");

        for (int i = 0; i < list.getLength(); i++) {
            NodeList innerList = list.item(i).getChildNodes();

            for (int j = 0; j < innerList.getLength(); j++) {
                System.out.println(innerList.item(j).getNodeName());
                System.out.println(innerList.item(j).getTextContent());
            }
        }
    }

}

and imports if you needed ;

- java.io.ByteArrayInputStream;

- java.io.IOException;

- java.nio.charset.Charset;

- javax.xml.soap.MessageFactory;

- javax.xml.soap.MimeHeaders;

- javax.xml.soap.SOAPBody;

- javax.xml.soap.SOAPException;

- javax.xml.soap.SOAPMessage;

- org.w3c.dom.NodeList;

Problem

I'm trying to get specific values from response I get from webservice. Unfortunately I don't know how to do it. I used code found on stackoverflow for creating soap request and writing out response content into stdout: ``` private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); Source sourceContent = soapResponse.getSOAPPart().getContent(); System.out.print("\nResponse SOAP Message = "); StreamResult result = new StreamResult(System.out); transformer.transform(sourceContent, result); } ``` It all works well but I dont need whole response content: ``` <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bin="http://localhost/WebService/bindings" xmlns:typ="http://localhost/WebService/types"> <soapenv:Header/> <soapenv:Body> <bin:doActionResponse> <bin:out> <typ:result> <typ:code>?</typ:code> <typ:description>?</typ:description> </typ:result> </bin:out> </bin:doActionResponse> </soapenv:Body> </soapenv:Envelope> ``` I just need value of code and description from this response. How can I do this?

Original source

Related problems