import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import javax.xml.soap.*;
      
public class Client {
    
    public static void main(String[] args) {
        try {
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = soapConnectionFactory.createConnection();
            SOAPFactory soapFactory = SOAPFactory.newInstance();
            
            MessageFactory factory = MessageFactory.newInstance();
            SOAPMessage message = factory.createMessage();
            
            SOAPBody body = message.getSOAPBody();
            Name bodyName = soapFactory.createName("getDataInventory", "", "urn:DataInventory");
            SOAPBodyElement bodyElement = body.addBodyElement(bodyName);

            //Constructing the body for the request
            Name name = soapFactory.createName("stationId");
            SOAPElement symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("8454000");
                        
            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/DataInventory");
            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");
            System.out.println("Printing Metadata \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;
                Iterator iterator4 = null;
                Iterator iterator5 = null;

                String tagName = null;
                SOAPElement se = null;
                Name attributeName = null;
                
                if (iterator.hasNext()) {
                    se = (SOAPElement) iterator.next();//Station Tag
                    iterator2 = se.getChildElements();
                    if (iterator2.hasNext()) {
                        se = (SOAPElement) iterator2.next();
                        tagName = se.getElementName().getLocalName();
                        
                        if (tagName != null && tagName.equals("station")) {
                            //attributes for a station
                            attributeName = soapFactory.createName("name");
                            System.out.println("Station Name     : " + se.getAttributeValue(attributeName));//Station Name  
                            attributeName = soapFactory.createName("ID");
                            System.out.println("Station ID       : " + se.getAttributeValue(attributeName));//Station ID 

                            iterator3 = se.getChildElements();
                            se = (SOAPElement) iterator3.next();//Metadata Tag
                            iterator4 = se.getChildElements();
   
                            while (iterator4.hasNext()) {
                                se = (SOAPElement) iterator4.next(); 
                                tagName = se.getElementName().getLocalName();
                                if (tagName != null) {
                                    if (tagName.equals("location")) {
                                        iterator5 = se.getChildElements();                            
                                        while (iterator5.hasNext()) {
                                            se = (SOAPElement) iterator5.next(); 
                                            tagName = se.getElementName().getLocalName();
                                            if (tagName != null) {
                                                //The name of the tag in this case is 'lat'
                                                if (tagName.equals("lat")) {
                                                    System.out.println("Latitude         : " + se.getValue());//Latitude
                                                } else if (tagName.equals("long")) {
                                                    System.out.println("Longitude        : " + se.getValue());//Longitude
                                                } else if (tagName.equals("state")) {
                                                    if (se.getValue() == null) {
                                                        System.out.println("State            : " );//State is Null
                                                    } else {
                                                        System.out.println("State            : " + se.getValue());//State
                                                    }
                                                }                                   
                                            }                            
                                        }
                                    } else if (tagName.equals("date_established")) {
                                        if (se.getValue() == null) {
                                            System.out.println("Established Date : " );//Established Date is Null
                                        } else {
                                            System.out.println("Established Date : " + se.getValue());//Established Date
                                        }
                                    } else if (tagName.equals("shef_id")) {
                                        if (se.getValue() == null) {
                                            System.out.println("SHEF ID          : " );//SHEF ID is Null
                                        } else {
                                            System.out.println("SHEF ID          : " + se.getValue());//SHEF ID
                                        }
                                    } else if (tagName.equals("deployment_designation")) {
                                        if (se.getValue() == null) {
                                            System.out.println("Deployment Designation : " );//Deployment Designation is Null
                                        } else {
                                            System.out.println("Deployment Designation : " + se.getValue());//Deployment Designation
                                        }
                                    }                                   
                                }                            
                            }

                            System.out.println("\nPrinting Data Inventory");
                            System.out.println("\nFirst\t\t\tLast\t\t\tData Type");
                            while (iterator3.hasNext()) {
                                se = (SOAPElement) iterator3.next(); 
                                attributeName = soapFactory.createName("first");
                                System.out.print(se.getAttributeValue(attributeName));
                                attributeName = soapFactory.createName("last");
                                System.out.print("\t" + se.getAttributeValue(attributeName));
                                attributeName = soapFactory.createName("name");
                                System.out.print("\t" + se.getAttributeValue(attributeName) + "\n");                            
                            }
                        }               
                    }                 
                }        
            }  
        } catch (SOAPException e) {
            System.err.println("ERROR: ******* " + e.toString());
        } catch (IOException io) {
            System.err.println("ERROR: ******* " + io.toString());
        }
    }
}
/****************************************************
        SAMPLE RUN

>java Client

Iterating through the response object to get the values:


Printing Metadata 

Station Name     : Providence
station ID       : 8454000
Latitude         : 41.8071
Longitude        : -71.4012
State            : RI
Established Date : 1938-06-03
SHEF ID          : FOXR1
Deployment Designation : NWLORTS

Printing Data Inventory

First			Last			Data Type
1999-10-07 12:00	2013-04-03 15:06	Wind
1999-09-22 18:00	2013-04-03 15:06	Air Temperature
1995-09-25 22:00	2013-04-03 15:06	Water Temperature
1999-08-24 19:00	2013-04-03 15:06	Barometric Pressure
1999-08-24 19:00	2001-01-11 07:00	Water Conductivity
2002-04-30 16:00	2012-05-21 16:54	Water Conductivity
2001-01-01 00:00	2013-04-03 15:06	Preliminary 6-Minute Water Level
1996-01-01 00:00	2013-03-31 23:54	Verified 6-Minute Water Level
1979-05-24 11:00	2013-03-31 23:00	Verified Hourly Height Water Level
1979-11-01 04:48	2013-03-31 23:54	Verified High/Low Water Level
1938-06-01 00:00	1947-06-30 23:54	Verified Monthly Mean Water Level
1956-09-01 00:00	1967-04-30 23:54	Verified Monthly Mean Water Level
1967-11-01 00:00	2013-03-31 23:54	Verified Monthly Mean Water Level

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