简体   繁体   中英

How to parse XML soap response using Javascript

I'm using Javascript to call a SOAP webservice. Using firebug, I can see that the request is successful, and I see the XML SOAP response.

How can I display the response on the webpage? Or even better - how can I display a single node within the XML SOAP response? I thought maybe I can use XPath - but it doesn't seem to be working.

Here is my code:

<html>
<head>
    <title>SOAP Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'https://mysoapurl.com', true);

            // build SOAP request
            var sr =
                '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<s:Header> ' +
                        '<USERNAME xmlns="http://www.tempuri.org">MyUsername</USERNAME>' +
                        '<PASSWORD xmlns="http://www.tempuri.org">MyPassword</PASSWORD>' +
                    '</s:Header>' +
                    '<s:Body>' +
                        '<GetData>Foo</GetData>' +
                    '</s:Body>' +
                '</s:Envelope>';            


            // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.setRequestHeader('SOAPAction', 'http://tempuri.org/MySoapActionURL');
            xmlhttp.send(sr);
            // send request
            // ...


            // This XPath query should get us the <GetResponse> element from the SOAP XML Response 
            var query = "//ns1:GetResponse[1]"; 

            // This object defines the namespaces used in the query 
            var namespaceMapping = { 
            ns1:  "http://tempuri.org/",  // SOAP namespace 
            diffgr: "urn:schemas-microsoft-com" // the service-specific namespace 
            }; 

            // Extract the <GetResponse> element from the response document 
            var responseNode=XML.getNode(XMLHttpRequest.responseXML, query, namespaceMapping);

            return responseNode;

        }

            window.onload = soap;

    </script>
</head>
<body>
</body>
<html>

Any help is greatly appreciated. Thanks for looking.

You can use the evaluate method on the responseXML :

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open('POST', 'https://mysoapurl.com', true);

        // build SOAP request
        var sr =
            '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                '<s:Header> ' +
                    '<USERNAME xmlns="http://www.tempuri.org">MyUsername</USERNAME>' +
                    '<PASSWORD xmlns="http://www.tempuri.org">MyPassword</PASSWORD>' +
                '</s:Header>' +
                '<s:Body>' +
                    '<GetData>Foo</GetData>' +
                '</s:Body>' +
            '</s:Envelope>';            


        // Send the POST request
        xmlhttp.setRequestHeader('Content-Type', 'text/xml');
        xmlhttp.setRequestHeader('SOAPAction', 'http://tempuri.org/MySoapActionURL');
        xmlhttp.onload = function(evt) {
          var doc = this.responseXML;
          var namespaceMapping = { 
            ns1:  "http://tempuri.org/",   
            diffgr: "urn:schemas-microsoft-com" 
          }; 
          var node = doc.evaluate('//ns1:GetResponse[1]', doc, 
             function (prefix) {
               return namespaceMapping[prefix];
             },
             XPathResult.FIRST_ORDERED_NODE_TYPE,
             null).singleNodeValue;
          if (node != null) {
            // now access node.textContent respectively run further queries on node
          }
        };
        xmlhttp.send(sr);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM