import javax.xml.soap.*;
import java.util.Iterator;
import java.net.URL;
import java.io.*;

public class Client {

    public static void main(String[] args) {
        try {
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = soapConnectionFactory.createConnection();
            SOAPMessage message = prepareMessage();

            System.out.print("\nPrinting the message that is being sent: \n\n");
            message.writeTo(System.out);
            System.out.println("\n\n");

            URL endpoint = new URL("https://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin");
            SOAPMessage response = connection.call(message, endpoint);
            connection.close();

            /*
            System.out.println("\nPrinting the respone that was recieved: \n\n");
            response.writeTo(System.out);
             */

            //Uncoment this part if you want the response to be saved locally in an XML file
            /*
            FileOutputStream fout = new FileOutputStream ("SoapResponse.xml");
            response.writeTo(fout);
            fout.close();
             */

            //You can also stores the response as a String
            /*
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.writeTo( out );
            String str = out.toString();  
             */

            System.out.println("\n\nIterating through the response object to get the values:\n\n");
            SOAPBody responseBody = response.getSOAPBody();

            //Checking for errors
            if (responseBody.hasFault()) {
                SOAPFault fault = responseBody.getFault();
                String actor = fault.getFaultActor();
                System.out.println("Fault contains: ");
                System.out.println("Fault code: " + fault.getFaultCodeAsName().getQualifiedName());
                System.out.println("Fault string: " + fault.getFaultString());
                if (actor != null) {
                    System.out.println("Actor: " + actor);
                }
            } else {
                Iterator iterator = responseBody.getChildElements();
                Iterator iterator2 = null;
                Iterator iterator3 = null;

                String tagName = null;
                SOAPElement se = null;

                if (iterator.hasNext()) {
                    se = (SOAPElement) iterator.next();
                    iterator = se.getChildElements();
                    while (iterator.hasNext()) {
                        se = (SOAPElement) iterator.next();
                        printMetadata(se);
                        tagName = se.getElementName().getLocalName();
                        if ("data".equals(tagName)) {
                            iterator2 = se.getChildElements();
                            while (iterator2.hasNext()) {
                                se = (SOAPElement) iterator2.next();
                                iterator3 = se.getChildElements();
                                while (iterator3.hasNext()) {
                                    se = (SOAPElement) iterator3.next();
                                    printData(se);
                                }
                            }
                        }
                    }
                }
            }

        } catch (SOAPException e) {
            System.err.println("ERROR: ******* " + e.toString());
        } catch (IOException io) {
            System.err.println("ERROR: ******* " + io.toString());
        }
    }

    public static SOAPMessage prepareMessage() {
        SOAPMessage message = null;
        try {
            SOAPFactory soapFactory = SOAPFactory.newInstance();

            MessageFactory factory = MessageFactory.newInstance();
            message = factory.createMessage();

            SOAPBody body = message.getSOAPBody();
            Name bodyName = soapFactory.createName("getWaterLevelRawOneMin", "water",
                    "https://opendap.co-ops.nos.noaa.gov/axis/webservices/waterlevelrawonemin/wsdl");
            SOAPBodyElement bodyElement = body.addBodyElement(bodyName);

            Name name = soapFactory.createName("stationId");
            SOAPElement symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("1611400");
            name = soapFactory.createName("beginDate");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("20081030 00:00");
            name = soapFactory.createName("endDate");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("20081030 00:18");
            name = soapFactory.createName("datum");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("MLLW");
            name = soapFactory.createName("unit");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("0");
            name = soapFactory.createName("timeZone");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("0");
        } catch (SOAPException e) {
            System.err.println("ERROR: ******* " + e.toString());
        }
        return message;
    }

    public static void printMetadata(SOAPElement se) {
        String tagName = se.getElementName().getLocalName();
        if (tagName != null) {
            if ("station_id".equals(tagName)) {
                System.out.println("Printing Metadata \n");
                System.out.println("Station ID       : " + se.getValue());
            } else if ("station_name".equals(tagName)) {
                System.out.println("station Name     : " + se.getValue());
            } else if ("latitude".equals(tagName)) {
                System.out.println("Latitude         : " + se.getValue());
            } else if ("longitude".equals(tagName)) {
                System.out.println("Longitude        : " + se.getValue());
            } else if ("state".equals(tagName)) {
                System.out.println("State            : " + se.getValue());
            } else if ("data_source".equals(tagName)) {
                System.out.println("Data Source      : " + se.getValue());
            } else if ("COOPS_disclaimer".equals(tagName)) {
                System.out.println("COOPS Disclaimer : " + se.getValue());
            } else if ("beginDate".equals(tagName)) {
                System.out.println("Begin Date       : " + se.getValue());
            } else if ("endDate".equals(tagName)) {
                System.out.println("End Date         : " + se.getValue());
            } else if ("datum".equals(tagName)) {
                System.out.println("Datum            : " + se.getValue());
            } else if ("unit".equals(tagName)) {
                System.out.println("Unit             : " + se.getValue());
            } else if ("timeZone".equals(tagName)) {
                System.out.println("Time Zone        : " + se.getValue() + "\n");
                System.out.println("Printing the data \n");
            }
        }
    }

    public static void printData(SOAPElement se) {
        String tagName = se.getElementName().getLocalName();
        if (tagName != null) {
            if (tagName.equals("dateTime")) {
                System.out.println("Date Time               : " + se.getValue());
            } else if (tagName.equals("WL_Val_1_MIN")) {
                System.out.println("Water Level 1 min       : " + se.getValue());
            } 
        }
    }
}
/****************************************************
SAMPLE RUN
 
>java Client
 
Printing the message that is being sent:
 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <water:getWaterLevelRawOneMin xmlns:water="https://opendap.co-ops.nos.noaa.gov/axis/webservices/waterlevelrawonemin/wsdl">
            <stationId>1611400</stationId>
            <beginDate>20081030 00:00</beginDate>
            <endDate>20081030 00:18</endDate>
            <datum>MLLW</datum>
            <unit>0</unit>
            <timeZone>0</timeZone>
        </water:getWaterLevelRawOneMin>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 
Iterating through the response object to get the values:


Printing Metadata 

Station ID       : 1611400
station Name     : NAWILIWILI, NAWILIWILI HARBOR, KAUAI
Latitude         : 21.9544
Longitude        : -159.3561
State            : HI
Data Source      : USDOC/NOAA/NOS/COOPS(Center for Operational Oceanographic Products and Services)
COOPS Disclaimer : These raw data have not been subjected to the National Ocean Service's quality control 
                   or quality assurance procedures and do not meet the criteria and standards of 
                   official National Ocean Service data. They are released for limited public use as 
                   preliminary data to be used only with appropriate caution.
Begin Date       : 20081030 00:00
End Date         : 20081030 00:18
Datum            : MLLW
Unit             : Meters
Time Zone        : GMT

Printing the data 

Date Time               : 2008-10-30 00:00:00.0
Water Level 1 min       : 0.192
Date Time               : 2008-10-30 00:01:00.0
Water Level 1 min       : 0.196
Date Time               : 2008-10-30 00:02:00.0
Water Level 1 min       : 0.193
Date Time               : 2008-10-30 00:03:00.0
Water Level 1 min       : 0.18
Date Time               : 2008-10-30 00:04:00.0
Water Level 1 min       : 0.184
Date Time               : 2008-10-30 00:05:00.0
Water Level 1 min       : 0.191
Date Time               : 2008-10-30 00:06:00.0
Water Level 1 min       : 0.184
Date Time               : 2008-10-30 00:07:00.0
Water Level 1 min       : 0.181
Date Time               : 2008-10-30 00:08:00.0
Water Level 1 min       : 0.189
Date Time               : 2008-10-30 00:09:00.0
Water Level 1 min       : 0.18
Date Time               : 2008-10-30 00:10:00.0
Water Level 1 min       : 0.173
Date Time               : 2008-10-30 00:11:00.0
Water Level 1 min       : 0.185
Date Time               : 2008-10-30 00:12:00.0
Water Level 1 min       : 0.183
Date Time               : 2008-10-30 00:13:00.0
Water Level 1 min       : 0.194
Date Time               : 2008-10-30 00:14:00.0
Water Level 1 min       : 0.205
Date Time               : 2008-10-30 00:15:00.0
Water Level 1 min       : 0.199
Date Time               : 2008-10-30 00:16:00.0
Water Level 1 min       : 0.206
Date Time               : 2008-10-30 00:17:00.0
Water Level 1 min       : 0.209
Date Time               : 2008-10-30 00:18:00.0
Water Level 1 min       : 0.192

**********************************************************/