상세 컨텐츠

본문 제목

Microsoft.XMLHTTP과 Msxml2.XMLHTTP의 차이

프로그래밍/스크립트

by 라제폰 2009. 2. 6. 17:28

본문

여러 예제들은 살펴본 결과 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이며,

IE 5 이후에서 XML HttpRequest객체는 다음과 같이 생성한다.


 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이후 버전에서는 앞에 공백이 있으면 그냥 텍스트 문서로 처리하는 듯하다.


관련글 더보기