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/WaterLevelVerifiedMonthly");
            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("getWLVerifiedMonthlyAndMetadata", "water", 
"https://opendap.co-ops.nos.noaa.gov/axis/webservices/waterlevelverifiedmonthly/wsdl"); SOAPBodyElement bodyElement = body.addBodyElement(bodyName); //Constructing the body for the request Name name = soapFactory.createName("stationId"); SOAPElement symbol = bodyElement.addChildElement(name); symbol.addTextNode("8454000"); name = soapFactory.createName("beginDate"); symbol = bodyElement.addChildElement(name); symbol.addTextNode("20150101 00:00"); name = soapFactory.createName("endDate"); symbol = bodyElement.addChildElement(name); symbol.addTextNode("20150501 00:00"); 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 ("stationId".equals(tagName)) { System.out.println("Printing Metadata \n"); System.out.println("Station ID : " + se.getValue()); } else if ("stationName".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 ("dataSource".equals(tagName)) { System.out.println("Data Source : " + 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 ("timeStamp".equals(tagName)) { System.out.println("Time Stamp: " + se.getValue()); } else if (tagName.equals("MHHW")) { System.out.println("MHHW : " + se.getValue()); } else if (tagName.equals("MHW")) { System.out.println("MHW : " + se.getValue()); } else if (tagName.equals("DTL")) { System.out.println("DTL : " + se.getValue()); } else if (tagName.equals("MTL")) { System.out.println("MTL : " + se.getValue()); } else if (tagName.equals("MSL")) { System.out.println("MSL : " + se.getValue()); } else if (tagName.equals("MLW")) { System.out.println("MLW : " + se.getValue()); } else if (tagName.equals("MLLW")) { System.out.println("MLLW : " + se.getValue()); } else if (tagName.equals("GT")) { System.out.println("GT : " + se.getValue()); } else if (tagName.equals("MN")) { System.out.println("MN : " + se.getValue()); } else if (tagName.equals("DHQ")) { System.out.println("DHQ : " + se.getValue()); } else if (tagName.equals("DLQ")) { System.out.println("DLQ : " + se.getValue()); } else if (tagName.equals("HWI")) { System.out.println("HWI : " + se.getValue()); } else if (tagName.equals("LWI")) { System.out.println("LWI : " + se.getValue()); } else if (tagName.equals("highest")) { System.out.println("Highest Tide : " + se.getValue()); } else if (tagName.equals("lowest")) { System.out.println("Lowest Tide : " + se.getValue()); } else if (tagName.equals("inferred")) { System.out.println("Inferred Tide : " + 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:getWLVerifiedMonthlyAndMetadata xmlns:water="https://opendap.co-ops.nos.noaa.gov/axis/webservices/waterlevelverifiedmonthly/wsdl"> <stationId>8454000</stationId> <beginDate>20150101 00:00</beginDate> <endDate>20150501 00:00</endDate> <datum>MLLW</datum> <unit>0</unit> <timeZone>0</timeZone> </water:getWLVerifiedMonthlyAndMetadata> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Iterating through the response object to get the values: Printing Metadata Station ID : 8454000 station Name : Providence Latitude : 41.8072 Longitude : -71.4011 State : RI Data Source : USDOC/NOAA/NOS/COOPS(Center for Operational Oceanographic Products and Services) Begin Date : 20150101 00:00 End Date : 20150501 00:00 Datum : MLLW Unit : Meters Time Zone : GMT Printing the data Time Stamp: 2015/01/01 00:00 MHHW : 1.42 MHW : 1.337 DTL : 0.649 MTL : 0.645 MSL : 0.598 MLW : -0.047 MLLW : -0.123 GT : 1.543 MN : 1.384 DHQ : 0.083 DLQ : 0.076 HWI : 0.33 LWI : 5.88 Highest Tide : 1.852 Lowest Tide : -0.447 Inferred Tide : 0 Time Stamp: 2015/02/01 00:00 MHHW : 1.443 MHW : 1.351 DTL : 0.679 MTL : 0.666 MSL : 0.609 MLW : -0.02 MLLW : -0.086 GT : 1.529 MN : 1.371 DHQ : 0.092 DLQ : 0.066 HWI : 0.38 LWI : 5.77 Highest Tide : 2.03 Lowest Tide : -0.702 Inferred Tide : 0 Time Stamp: 2015/03/01 00:00 MHHW : 1.369 MHW : 1.288 DTL : 0.622 MTL : 0.618 MSL : 0.572 MLW : -0.053 MLLW : -0.126 GT : 1.495 MN : 1.341 DHQ : 0.081 DLQ : 0.073 HWI : 0.38 LWI : 5.86 Highest Tide : 1.939 Lowest Tide : -0.523 Inferred Tide : 0 Time Stamp: 2015/04/01 00:00 MHHW : 1.471 MHW : 1.398 DTL : 0.731 MTL : 0.717 MSL : 0.681 MLW : 0.036 MLLW : -0.01 GT : 1.481 MN : 1.362 DHQ : 0.073 DLQ : 0.046 HWI : 0.42 LWI : 5.73 Highest Tide : 2.089 Lowest Tide : -0.323 Inferred Tide : 0 Time Stamp: 2015/05/01 00:00 MHHW : 1.439 MHW : 1.373 DTL : 0.716 MTL : 0.699 MSL : 0.663 MLW : 0.024 MLLW : -0.007 GT : 1.446 MN : 1.349 DHQ : 0.066 DLQ : 0.031 HWI : 0.44 LWI : 5.75 Highest Tide : 1.81 Lowest Tide : -0.235 Inferred Tide : 0 *********************************************************/