MSXML 6,User / PW Auth,ResolveExternals

时间:2011-07-21 04:35:46

标签: msxml msxml6

如果必须从受用户/ PW保护的URL加载和解析XML资源,就我所知,你不能只使用MSXML DOM.Load()。没有地方可以指定凭据。

然而,如果您使用XMLHTTPRequest获取资源并将其解析为DOM(通过其.responseXML属性),则无法为.resolveExternals属性指定值。

当您使用默认为True的MSXML 3,4,(或甚至5)时,这或多或少有效,但在MSXML 6中默认为False:

resolveExternals Property

  

在MSXML 3.0,MSXML 4.0和MSXML 5.0中,默认 resolveExternals   值为True。在MSXML 6.0中,默认设置为False。

     

如果此属性设置为False,则不包括外部包含和导入   将被解决。

我有没有办法解决这个问题?通常我需要解析外部,特别是在处理XSD或WSDL时。

或者我在欺骗自己,也许.resolveExternals在使用XMLHTTPRequest(只有DOM.Load()调用时)从不适用?

1 个答案:

答案 0 :(得分:1)

你尝试过这样的事吗?

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内部的脚本,并且有一个名为XMLHttpRequest的Trident本机组件,它与XmlHttp ActiveX组件完全不同。但是,如果您指的是驻留在MSXML6.DLL中的IXMLHttpRequest COM接口,则可以轻松地将上述代码转换为C ++。