2012-11-23 16 views
6

Trochę utknąłem próbując dołączyć wiele przestrzeni nazw do elementu XML za pośrednictwem javascript w różnych przeglądarkach .. Próbowałem na kilkanaście różnych sposobów bezskutecznie. . :(ja zazwyczaj przy użyciu javascript zwykły stary, ale przez wzgląd na utrzymanie tego przykładu krótki, to w jaki sposób to, co robię będzie się odbywać za pomocą jQuery:Jak dodać dodatkowe atrybuty przestrzeni nazw xmlns do XML w javascript

var soapEnvelope = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"></soapenv:Envelope>'; 
var jXML = jQuery.parseXML(soapEnvelope); 
$(jXML.documentElement).attr("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); 

zarówno Chrome i FF, to działa zgodnie z oczekiwaniami, dając taki wynik:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

Ale w IE9, otrzymuję wynik tak:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:NS1="" NS1:xmlns:xsd="http://www.w3.org/2001/XMLSchema"/> 

I nie mogę znaleźć sposób na dodanie tego atrybutu namespace bez IE9 dodając ten przedrostek NS1 do moich katalogów. Również jeśli spróbuję przekazać ten wynik z powrotem do $ .parseXML (wynik), otrzymam zniekształcony wyjątek XML.

Czy nie rozumiem, że ma coś wspólnego ze sposobem zadeklarowania przestrzeni nazw w IE, czy też ktoś może zaproponować sposób uzyskania spójnego wyniku w różnych przeglądarkach?

góry dzięki

Odpowiedz

4

w przypadku ktokolwiek inny wpada na podobny problem z tym, skończyło się na stwierdzeniu, że to może być ustalona przez inicjalizacji obiektu IE XML DOM inaczej na drodze jQuery robi. Użyłem czegoś podobnego do następującego i teraz wydaje się, że przestrzenie nazw XML działają dobrze we wszystkich głównych przeglądarkach, a metoda jQuery attr będzie teraz działać ponownie.

var getIEXMLDOM = function() { 
    var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0' ]; 
    for (var i = 0; i < progIDs.length; i++) { 
    try { 
     var xmlDOM = new ActiveXObject(progIDs[i]); 
     return xmlDOM; 
    } catch (ex) { } 
    } 
    return null; 
} 

var xmlDOM; 
if ($.browser.msie) { 
    xmlDOM = getIEXMLDOM(); 
    xmlDOM.loadXML(soapEnvelope); 
} else { 
    xmlDOM = jQuery.parseXML(soapEnvelope); 
} 

$(xmlDOM.documentElement).attr("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); 
+1

+1. W każdym razie powinieneś zmodyfikować test przeglądarki. Obecnie wolisz własne podejście, ale IE 9+ obsługuje 'window.DOMParser', który jest domyślnie jQuery wewnętrznie. Nie rób 'if ($ .browser.msie)', do 'if (! Window.DOMParser)'. Poniżej znajduje się ładny opis tworzenia deklaracji przestrzeni nazw w MSXML: http://msmvps.com/blogs/martin_honnen/archive/2009/04/15/creating-xml-with-namespaces-with-javascript-and- msxml.aspx – Tomalak

+0

Cheers @Tomalak – 2potatocakes

+0

Bez jQuery: var objXmlDomParser = new DOMParser(); xmlDOM = objXmlDomParser.parseFromString (soapEnvelope, "text/xml"); xmlDOM.documentElement.setAttribute ("xmlns: xsd", "http://www.w3.org/2001/XMLSchema"); –

Powiązane problemy