我试图通过跨浏览器的javascript将多个名称空间附加到XML元素有点困难。 我试过了十几种不同的方法无济于事.. :( 我通常使用普通的旧javascript,但为了保持这个例子简短,这就是我正在做的事情将通过jQuery完成:
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");
在Chrome和FF中,这都按预期工作,得到如下结果:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
但是在IE9中,我得到了这样的结果:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:NS1="" NS1:xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
如果没有IE9将这个NS1前缀添加到我的命名空间,我找不到添加此命名空间属性的方法。此外,如果我尝试将此结果传回$ .parseXML(结果),我会收到格式错误的XML异常。
我是否误解了在IE中声明命名空间的方式,或者有人建议我可以在浏览器中获得一致的结果吗?
提前致谢
答案 0 :(得分:4)
如果其他人遇到类似的问题,我最终发现可以通过初始化IE XML DOM对象与jQuery的方式不同来修复它。我使用了类似于以下内容的东西,现在xml命名空间似乎在所有主流浏览器中运行良好,jQuery attr方法现在也可以再次使用。
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");