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

他の誰かがこれと同様の問題に遭遇した場合に備えて、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");
于 2012-12-02T01:28:21.137 に答える