2012-11-23 4 views
6

Ich bin ein wenig stecken stecken versucht, mehrere Namespaces zu einem XML-Element über JavaScript über Browser anschließen. Ich habe über ein Dutzend verschiedene Möglichkeiten vergeblich versucht. . ich :( bin mit Ebene in der Regel alt Javascript sondern um dieses Beispiel kurz zu halten, das ist, wie, was ich tue über jQuery getan werden würde:Wie fügen Sie zusätzliche Xmlns Namespace-Attribute zu XML in 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"); 

sowohl in Chrome und FF, das arbeitet wie erwartet und gibt ein Ergebnis wie folgt aus:

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

Aber in IE9, bekomme ich ein Ergebnis wie folgt aus:

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

Und ich kann nicht einen Weg hinzufügen, um dieses Namespace-Attribut ohne IE9 Hinzufügen dieses NS1 Präfix meiner Namespaces finden. Auch wenn ich versuche, dieses Ergebnis wieder in $ .parseXML (Ergebnis) zu übergeben, erhalte ich eine fehlerhafte XML-Ausnahme.

Missverstehe ich etwas mit der Art und Weise, wie Namespaces im IE deklariert werden, oder kann jemand vorschlagen, wie ich ein konsistentes Ergebnis in allen Browsern erzielen kann?

Vielen Dank im Voraus

Antwort

4

Falls jemand ein ähnliches Problem auf diese läuft in, landete ich herauszufinden, bis dass es Objekt unterschiedlich auf die Art und Weise des IE XML DOM behoben werden kann es jQuery funktioniert durch Initialisierung. Ich habe etwas verwendet, das dem folgenden ähnlich ist, und nun scheinen die XML-Namespaces über alle gängigen Browser hinweg gut zu funktionieren und die Methode jQuery attr funktioniert nun auch wieder.

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. Wie auch immer, du solltest deinen Browsertest modifizieren. Derzeit bevorzugen Sie den proprietären Ansatz, aber IE 9+ unterstützt 'window.DOMParser', was jQuery standardmäßig intern ist. Tun Sie nicht 'if ($ .browser.msie)', tun Sie 'if (! Window.DOMParser)'. Hier ist auch eine nette Zusammenfassung über das Erstellen von Namespace-Deklarationen in MSXML: http://msmvps.com/blogs/martin_honnen/archive/2009/04/15/creating-xml-with-namespaces-with-javascript-and- msxml.aspx – Tomalak

+0

Prost @Tomalak – 2potatocakes

+0

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

Verwandte Themen