6

我在尝试通过跨浏览器的 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(result) ,则会收到格式错误的 XML 异常。

我是否误解了与在 IE 中声明命名空间的方式有关的事情,或者任何人都可以建议一种我可以在浏览器中获得一致结果的方法吗?

提前致谢

4

1 回答 1

4

万一其他人遇到与此类似的问题,我最终发现可以通过以不同于 jQuery 的方式初始化 IE XML DOM 对象来修复它。我使用了类似于以下内容的东西,现在 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");
于 2012-12-02T01:28:21.137 回答