如果必须从受用户/ PW保护的URL加载和解析XML资源,就我所知,你不能只使用MSXML DOM.Load()。没有地方可以指定凭据。
然而,如果您使用XMLHTTPRequest获取资源并将其解析为DOM(通过其.responseXML属性),则无法为.resolveExternals属性指定值。
当您使用默认为True的MSXML 3,4,(或甚至5)时,这或多或少有效,但在MSXML 6中默认为False:
在MSXML 3.0,MSXML 4.0和MSXML 5.0中,默认 resolveExternals 值为True。在MSXML 6.0中,默认设置为False。
如果此属性设置为False,则不包括外部包含和导入 将被解决。
我有没有办法解决这个问题?通常我需要解析外部,特别是在处理XSD或WSDL时。
或者我在欺骗自己,也许.resolveExternals在使用XMLHTTPRequest(只有DOM.Load()调用时)从不适用?
答案 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 ++。