0

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

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

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

resolveExternals 属性

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

如果此属性设置为 False,则不会解析任何外部包含和导入。

有没有我没有看到的解决方法?通常我需要解决外部问题,尤其是在处理 XSD 或 WSDL 时。

还是我在自欺欺人,也许 .resolveExternals 在使用 XMLHTTPRequest 时永远不适用(仅 DOM.Load() 调用)?

4

1 回答 1

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();

示例.xml

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

样本.dtd

<!ENTITY ent "Hello world!">

如果您使用 IE9 运行上述 cod,您将成功解析实体。但是,如果您切换到注释掉的 XMLHttpRequest,您将失败。

PS:我以为你说的是​​ IE 里面的脚本,还有一个叫做 XMLHttpRequest 的 Trident 原生组件,它与 XmlHttp ActiveX 组件有很大的不同。但是,如果您指的是驻留在 MSXML6.DLL 中的 IXMLHttpRequest COM 接口,您可以轻松地将上述代码转换为 C++。

于 2011-07-27T02:42:30.063 回答