2012-04-16 12 views
6

Poniższy kod działa w przeglądarce Chrome, ale nie w wersji IE ani FireFox. Czy ktoś zna odpowiedni kod przeglądarki?

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
    <a:Action s:mustUnderstand="1">http://tempuri.org/SubscriptionService/Update</a:Action> 
    <netdx:Duplex xmlns:netdx="http://schemas.microsoft.com/2008/04/netduplex"> 
     <netdx:Address>http://docs.oasis-open.org/ws-rx/wsmc/200702/anonymous?id=4ed8a7ee-b124-e03e-abf0-a294e99cff73</netdx:Address> 
     <netdx:SessionId>177b4f47-5664-d96c-7ffa-0a8d879b67dd</netdx:SessionId> 
    </netdx:Duplex> 
</s:Header> 
<s:Body> 
    <Update xmlns="http://tempuri.org/"> 
     <lstResponseStruct xmlns:b="http://schemas.datacontract.org/2004/07/FSS.Libs.Core.InterprocessData.RMS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <b:DataA> 
       <b:ValueA>1.339565</b:ValueA> 
       <b:Status>None</b:Status> 
      </b:DataA> 
      <b:DataA> 
       <b:ValueA>120.3717</b:ValueA> 
       <b:Status>None</b:Status> 
      </b:DataA> 
      <b:DataA> 
       <b:ValueA>133.563116</b:ValueA> 
       <b:Status>None</b:Status> 
      </b:DataA> 
      <b:DataA> 
       <b:ValueA>-0.0059159999999999994</b:ValueA> 
       <b:Status>None</b:Status> 
      </b:DataA> 
     </lstResponseStruct> 
    </Update> 
</s:Body> 

Oto fragmenty kodu JavaScript ...

<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script> 

var nodes; 
if (typeof DOMParser != "undefined") 
    nodes = ((new DOMParser()).parseFromString(request.responseText, "application/xml")).getElementsByTagName("*"); 
else { 
    request.responseXML.loadXML(request.responseText); 
    nodes = request.responseXML.getElementsByTagName("*"); 
} 

for (var i = 0; i < nodes.length; i++) { 
    var element = nodes[i]; 
    ... 
    if ((element.localName == "Body" || element.baseName == "Body") && element.namespaceURI == "http://www.w3.org/2003/05/soap-envelope") { 
     body = element; 
     break; 
} 

$(body).find('DataA').each(function() { 
    ... Do something 
} 

z jakiegoś powodu, w każdej przeglądarce "ciało" zdecydowanie zawiera xml ciała, jednak $ (korpus) .find ('DataA') nie zwraca wyników dla IE ani FireFox.

Aktualizacja:

Dodanie przestrzeni nazw $ (korpus) .find ('b \\: DataA') działa dobrze w Firefox i IE, ale przerywa Chrome!

+4

Wskazówka: Użyj metody jQuery ['$ .parseXML'] (http://api.jquery.com/jQuery.parseXML/). Zwraca obiekt "XMLDocument" (nie obiekt jQuery). Aby uzyskać obiekt jQuery, zawiń wartość zwracaną: '$ ($. ParseXML (' Test'));' –

+0

Co więcej, ponieważ wygląda na to żądanie ajax, użyj 'ajax' jquery i ustaw wartość' dataType 'odpowiednio (lub pozwól jquery to rozgryźć) i nie musisz nawet wywoływać' parseXML' bezpośrednio. –

+0

$ (xData.responseXML) .find ("z \\: wiersz, wiersz"). Each (function() {// Do Stuff}); Wydaje się działać w IE, FireFox i Chrome. – antwarpes

Odpowiedz

12

To był problem z dostępem do węzłów XML bez określonej przestrzeni nazw. Z jakiegoś powodu Chrome nie chce widzieć przestrzeni nazw.

Znalazłem, że selektor "b \: DataA" działa w FireFox i IE, a selektor "DataA" działa w Chrome.

tak ...

$(xData.responseXML).find("b\\:DataA, DataA").each(function() { // Do Stuff }); 

wydaje się działać dla IE, Firefox i Chrome.

patrz http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/, aby uzyskać więcej informacji i sposobów poprawy wydajności wyszukiwania węzłów XML.

+1

Dzięki, mamy ten sam problem. +1 za rozwiązanie mojego problemu. –

+0

Dzięki, to rozwiązało mój problem. Aha, i działa też w Safari, jeśli o to chodzi. :-) – Drew

0

Działa poprawnie !!! Spróbuj tego,

Chrome/Firefox:

xml.children[0].childNodes[1].innerHTML; 

IE8 +/Safari:

xml.childNodes[0].childNodes[1].textContent; 

IE8:

xml.documentElement.childNodes[1].text; 

kod tutaj próbek,

var xml = $.parseXML(XMLDOC); 

Var xmlNodeValue = ""; 

if(userAgent.match("firefox")){ 

xml.children[0].childNodes[1].innerHTML; 

}else{ // IE8+ 

xmlNodeValue = xml.childNodes[0].childNodes[1].textContent; 

} 
+0

Odwołanie się przy użyciu twardego indeksu pozycji pozycji nie jest elastyczne. – lulalala

Powiązane problemy