2015-11-18 6 views
0

Я изучаю, как использовать javascript для вызова веб-метода из службы ASMX с использованием класса XMLHttpRequest. Я успел написать следующее:javascript, как получить значение из XML

function GetDataService() { 
      if (window.XMLHttpRequest) { 
       xmlHTTP = new window.XMLHttpRequest; 
      } else { 
       alert("Wrong!"); 
      } 

      xmlHTTP.open("POST", "http://localhost:45250/ServiceJava.asmx", true); 
      xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 
      xmlHTTP.setRequestHeader("SOAPAction", "http://localhost:45250/ServiceJava.asmx/GetTimeString"); 

      strRequest = '<?xml version="1.0" encoding="utf-8"?>'; 
      strRequest = strRequest + '<soap:Envelope ' 
       + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' 
       + 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' 
       + 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'; 
      strRequest = strRequest + '<soap:Body>'; 
      strRequest = strRequest + '<GetTimeString xmlns="http://localhost:45250/ServiceJava.asmx" />'; 
      strRequest = strRequest + '</soap:Body>'; 
      strRequest = strRequest + '</soap:Envelope>'; 

      //Different value for readystate 
      //0--Uninitialized 
      //1--Loading 
      //2--loaded(but data not recieved) 
      //3--Interactive--Some part of the data is recieved 
      //4--Completed(all data recieved) 
      xmlHTTP.onreadystatechange = function() { 
       if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) { 
        var x = xmlHTTP.responseXML; 
        document.getElementById("time").textContent = x;     
       } 
      } 
      xmlHTTP.send(strRequest); 
     } 

Но он производит код:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetTimeStringResponse xmlns="http://localhost:45250/ServiceJava.asmx"><GetTimeStringResult>14:31:28</GetTimeStringResult></GetTimeStringResponse></soap:Body></soap:Envelope> 

Теперь я хотел бы получить только 14:31:28. Как я могу это сделать? Я попытался найти ответ, но x, похоже, не имеет метода getElementByTagName() или чего-то подобного.

Спасибо!

ответ

2

Solution без использования JQuery

var xmlStr = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope ...';  
var xml = new window.DOMParser().parseFromString(xmlStr, "text/xml"); 
var value = xml.getElementsByTagName("GetTimeStringResult")[0].innerHTML; 
+0

Я принял этот ответ, потому что он не использует 'jQuery' и по этой причине мне это нужно. Тем не менее у меня есть вопрос ... Если мой 'xmlStr' был из' (..). ResponseXML' поэтому зачем мне создавать строку, затем снова конвертировать ее в XML и, наконец, использовать 'getElement ...'? Почему я не мог работать с оригинальным XML? Это только что прочитанное? –

+0

Кажется, вам нужно установить заголовок Content-Type в text/xml: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML – Greg

+0

В нем говорится: «Если сервер не делает», t укажите заголовок Content-Type в виде text/xml или application/xml, вы можете использовать overrideMimeType(), чтобы заставить XMLHttpRequest анализировать его как XML в любом случае. ' Дело в том, что сервер указывает Content-Type как' text/xml' , так что это странно. –

1

Вы можете использовать, например, метод jQuery parseXML.

var response = "<?xml version="1.0" encodi..."; 
var xml= $($.parseXML(response)); 
var value = xml.find("GetTimeStringResult").text(); 

Однако, если вы решите отправить запрос с JQuery вместо ванили JavaScript, вы получите ответ уже десериализованный в функции обратного вызова.

+0

Как я уже писал выше, я был "вынужден" использовать ванильный JavaScript. Но поскольку я получил результат, я думаю, что я могу использовать 'jQuery' для получения моего результата. –

1

Я рекомендую вам не писать XMLHttpRequests вручную. Вместо того, чтобы использовать jQuery.ajax():

$.ajax({ 
    url: "http://localhost:45250/ServiceJava.asmx/GetTimeString", 
    type: "POST", 
    data: postData, 
    success: function(data, textStatus, jqXhr) { 
      var result = data.GetTimeStringResult; 
    } 
}); 

«PostData» должен быть объект JSON, в котором вы передаете ваши параметры в конечной точке.

+0

Привет. Спасибо за информацию. К сожалению, это моя задача использовать этот класс, иначе я бы посмотрел на 'jQuery', я думаю :) –

+0

Внутренне jQuery.ajax() также создает XMLHttpRequest, он просто освобождает вас от непосредственного обращения с SOAP XML. –

Смежные вопросы