MSXML 6, Пользователь / PW Auth, ResolveExternals - PullRequest
0 голосов
/ 21 июля 2011

Если нужно загрузить и проанализировать ресурс XML с URL-адреса, защищенного пользователем / PW, вы не можете просто использовать MSXML DOM.Load (), насколько я могу судить.Нет места для указания учетных данных.

Тем не менее, если вы используете XMLHTTPRequest для получения и анализа ресурса в DOM (через его свойство .responseXML), вам некуда указать значение для свойства .resolveExternals.

Это более или менее работает при использовании MSXML 3, 4, (или даже 5), где по умолчанию установлено значение True, однако в MSXML 6 по умолчанию используется значение False:

resolExternals Property:

В MSXML 3.0, MSXML 4.0 и MSXML 5.0 значение по умолчанию resolExternals равно True.В MSXML 6.0 значением по умолчанию является False.

Если для этого свойства установлено значение False, внешние включения и импорт не будут разрешены.

Есть ли способ обойти это, чего я не вижу?Обычно мне нужно разрешить внешние проблемы, особенно при работе с XSD или WSDL.

Или я обманываю себя, и, возможно, .resolveExternals никогда не применяется при использовании XMLHTTPRequest (только вызовы DOM.Load ())?

1 Ответ

1 голос
/ 27 июля 2011

Вы пробовали что-то подобное?

xmlhttp.responseXML.resolveExternals = true; 
xmlhttp.responseXML.setProperty("ProhibitDTD", false);

Единственное, что решение может работать только с MSXML XMLHTTP ActiveX объект.

Редактировать: вот конкретный пример с IE9:

var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.6.0");
// var xmlhttp = new XMLHttpRequest();

xmlhttp.open("GET", "sample.xml", false);
xmlhttp.responseXML.async = false;
xmlhttp.responseXML.resolveExternals = true;
xmlhttp.responseXML.validateOnParse = false;
xmlhttp.responseXML.setProperty("ProhibitDTD", false);
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readystate == 4 && xmlhttp.status == 200) {
         alert(xmlhttp.responseXML.xml);
    }
}
xmlhttp.send();

sample.xml

<!DOCTYPE data SYSTEM "sample.dtd"><data>&ent;</data>

sample.dtd

<!ENTITY ent "Hello world!">

Если вы запустите вышеупомянутый код с IE9, вы успешно получите разрешение сущности,Однако, если вы переключитесь на закомментированный XMLHttpRequest, у вас ничего не получится.

PS: я думал, что вы говорили о сценариях внутри IE, и есть собственный компонент Trident, называемый XMLHttpRequest, который сильно отличается от компонента XmlHttp ActiveX,Однако, если вы ссылаетесь на интерфейс COM IXMLHttpRequest, находящийся в MSXML6.DLL, вы можете с легкостью перевести приведенный выше код в C ++.

...