여러 예제들은 살펴본 결과 IE에서 XMLHttpRequest 객체를 생성하는데 Msxml2.XMLHTTP와 Microsoft.XMLHTTP를 사용하는 것을 알 수 있었다.
그런데 이 두 놈에 대한 차이를 설명해주는 곳이 없어서 차이점을 찾아 어설픈 번역을 해본다.
=======================================================================================
MSXML에는 프로그램 아이디에 의존하는 버전과 프로그램아이디에 독립적인 버전이 존재한다.
일반적으로 스크립트가 구동되는 클라이언트가 어떤 버전의 IE일지 또 어떤 버전의 MSXML
이 설치되어 있을지 모를 경우 프로그램 아이디에 독립적인 버전을 사용하는 것이 좋다.
MSXML 버전이 어떤 프로그램 아이디와 연결되는지 정확히 알 필요 없을 때 사용할 수 있다.
XML DOM document의 프로그램 아이디 독립버전은 Microsoft.XMLDOM이며,
IE 5 이후에서 XML DOM을 다음과 같이 생성한다.
var xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
와 같이 생성한다.
XML HTTP request 객체의 프로그램 아이디 독립 버전은 Microsoft.XMLHTTP이며,
var httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
프로그램 아이디 같은 실제 MSXML버전은 인스톨된 MSXML버전에 의존한다.
Which actual MSXML version such a program id is bound to depends on the
MSXML version(s) installed and even on the mode (side-by-side or replace
mode) a version is installed in.
프로그램 의존 버전은 서버에 어떤 버전의 MSXML이 설치되었는지 알고 있는 상태로 스크립팅 작업을 할 경우, 인트라넷 속해 있는 모든 클라이언트에 어떤 버전의MSXML이 설치 되어있는지 알고있는 상태에서 작업할 경우 마지막으로 특정 버전의 MSXML 에서만 지원되는 기능을 사용하기를 원할 때 사용할 수 있다.
MSXML 3,4,5에 해당하는 XMLHttpRequest 객체의 프로그램 아이디 의존 버전은 각각 다음과 같다.
Msxml2.XMLHTTP.version.number
예) MSXML 3으로 구현된 XMLHttpRequest 객체 생성방법
var httpRequest = new ActiveXObject('Msxml2.XMLHTTP.3.0');
MSXML 4으로 구현된 XMLHttpRequest 객체 생성방법
var httpRequest = new ActiveXObject('Msxml2.XMLHTTP.4.0');
MSXML 5으로 구현된 XMLHttpRequest 객체 생성방법
var httpRequest = new ActiveXObject('Msxml2.XMLHTTP.5.0');
NOTE>>
MSXML 4 이후로는 프로그램 아이디 의존버전만이 존재한다. 따라서 그 이전의 프로그램 아이디 독립 버전은 MSXML 4 or 5에는 바운드 되지 않는다.
====================================================================================
원문 : http://www.faqts.com/knowledge_base/view.phtml/aid/35742
====================================================================================
다음은 내 컴퓨터에서의 테스트 결과이다.
Msxml2.XMLHTTP의 경우 2.6과 3.0 버전이 설치되어 있었고 각 버전에서 반환되는
XMLHTTPRequest객체에서 제공하는 API가 틀렸다.
먼저 2.6 버전 :
this.transport = new ActiveXObject('Msxml2.XMLHTTP.2.6');
위와 같이 객체를 생성, 서버에 접속하여 XML을 리턴 받은 후에
this.transport .responseXML.documentElement로 접근할 경우 에러없이 DOM 객체가 리턴되었다.
3.0 버전 :
this.transport = new ActiveXObject('Msxml2.XMLHTTP.3.0');
위와 같이 객체를 생성한 후 2.6과 같은 과정을 거친 후에 this.transport .responseXML.documentElement 로 접근할 경우 null이 리턴되는 현상이 발생했다.
또 'Microsoft.XMLHTTP'의 경우 1.0 버전만이 설치되 있었고 아래와 같이 객체를 생성한 후에
this.transport .responseXML.documentElement으로 접근할 때는 문제 없이 수행되었다.
this.transport = new ActiveXObject('Microsoft.XMLHTTP')
이는 Microsoft.XMLHTTP과 Msxml2.XMLHTTP 2.6 버전이 바운드 됐기 때문으로 판단된다.
=====================================================================================
음..몇시간에 걸친 사투끝에 이제 모든 버전에서 이상없이 잘 돌아간다.
문제의 원인 서버측에서 보내주는 XML 에 첫부분에 공백이 들어가 있어서 였다. ㅡ.ㅡ;;
2.6버전에서는 문서 앞부분에 공백이 있어도 XML 문서로 잘 인식하는 반면에 3.0이후 버전에서는 앞에 공백이 있으면 그냥 텍스트 문서로 처리하는 듯하다.